PL / SQL数组到CLOB

时间:2010-02-19 16:03:22

标签: oracle arrays plsql clob

我正在使用Oracle 9i。

我将数据从游标中提取到数组中:

FETCH contract_cur 
        BULK COLLECT INTO l_contract ;

但现在我想把这个 l_contract “转换”成CLOB变量 l_clob

有一种简单的方法吗?

或者,如何将SELECT语句中的行转换为单个CLOB变量?

感谢

编辑:我忘了提及它的%ROWTYPE数组,而不仅仅是一列。

2 个答案:

答案 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;
/