PL / SQL pour Array CLOB
Question
i m en utilisant Oracle 9i.
I m extraire des données à partir d'un curseur dans un tableau:
FETCH contract_cur
BULK COLLECT INTO l_contract ;
Mais maintenant je veux "convertir" cette l_contract dans une variable CLOB l_clob
Y at-il un moyen facile de le faire?
Ou sinon, comment puis-je convertthe les lignes d'une instruction SELECT en une seule variable CLOB?
Merci
EDIT: j'ai oublié de mentionner son un tableau de% ROWTYPE, pas seulement une colonne
.La solution
Quelle vilaine chose à faire.
Est-il toutes les données de caractère, ou avez-vous numériques et / ou valeurs date / heure là aussi? Si oui quel format souhaitez-vous utiliser pour ces types de données lorsque vous les convertir en chaînes.
Vous devrez peut-être penser à délimiteurs de champ et d'enregistrement.
Avez-vous envisagé XML?
declare
v_clob clob;
v_xml xmltype;
begin
select xmlagg(XMLELEMENT("test",xmlforest(id,val)))
into v_xml
from test;
select v_xml.getclobval
into v_clob
from dual;
dbms_output.put_line(v_clob);
end;
/
Autres conseils
vous pouvez parcourir votre tableau et construire le CLOB que vous allez:
SQL> DECLARE
2 TYPE tab_vc IS TABLE OF VARCHAR2(4000);
3 l_contract tab_vc;
4 l_clob CLOB;
5 BEGIN
6 dbms_lob.createtemporary (l_clob, TRUE);
7 SELECT to_char(dbms_random.STRING('a', 1000)) BULK COLLECT
8 INTO l_contract
9 FROM dual
10 CONNECT BY LEVEL <= 100;
11 FOR i IN 1..l_contract.count LOOP
12 dbms_lob.writeappend(l_clob,
13 length(l_contract(i)),
14 l_contract(i));
15 END LOOP;
16 -- your code here
17 dbms_lob.freetemporary(l_clob);
18 END;
19 /
PL/SQL procedure successfully completed
Si vous n'utilisez pas l_contract
pour tout ce que vous pouvez construire le CLOB directement à partir de la boucle de curseur sans l'étape de tableau, il permettra d'économiser la mémoire et sera probablement plus rapide:
SQL> DECLARE
2 l_clob CLOB;
3 BEGIN
4 dbms_lob.createtemporary (l_clob, TRUE);
5 FOR cc IN ( SELECT to_char(dbms_random.STRING('a', 1000)) txt
6 FROM dual
7 CONNECT BY LEVEL <= 100) LOOP
8 dbms_lob.writeappend(l_clob,
9 length(cc.txt),
10 cc.txt);
11 END LOOP;
12 -- your code here
13 dbms_lob.freetemporary(l_clob);
14 END;
15 /
PL/SQL procedure successfully completed