我正在使用 Oracle 9i。
我正在将游标中的数据提取到数组中:
FETCH contract_cur
BULK COLLECT INTO l_contract ;
但现在我想把这个l_contract “转换”成一个 CLOB 变量l_clob
有没有简单的方法可以做到这一点?
或者,我如何将 SELECT 语句中的行转换为一个 CLOB 变量?
谢谢
编辑:我忘了提到它的 %ROWTYPE 数组,而不仅仅是一列。
您可以遍历您的数组并随时构建 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
这是多么丑陋的事情。
是所有字符数据,还是那里也有数字和/或日期/时间值?如果是这样,当您将它们转换为字符串时,您希望对这些数据类型使用什么格式。
您可能还需要考虑字段和记录分隔符。
你考虑过 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;
/