我正在使用Oracle 9i。
我将数据从游标中提取到数组中:
FETCH contract_cur
BULK COLLECT INTO l_contract ;
但现在我想把这个 l_contract “转换”成CLOB变量 l_clob
有一种简单的方法吗?
或者,如何将SELECT语句中的行转换为单个CLOB变量?
感谢
编辑:我忘了提及它的%ROWTYPE数组,而不仅仅是一列。答案 0 :(得分:2)
你可以在你的数组中循环并构建CLOB:
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
如果你不使用l_contract
进行其他任何操作,你可以直接从游标循环构建CLOB而不使用数组步骤,它将节省内存并且可能会更快:
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
答案 1 :(得分:2)
这是多么丑陋的事情。
是否所有字符数据,或者您是否还有数字和/或日期/时间值?如果是这样,当您将它们转换为字符串时,您希望将哪种格式用于这些数据类型。
您还可能需要考虑字段和记录分隔符。
您是否考虑过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;
/