代码之家  ›  专栏  ›  技术社区  ›  guigui42

PL/SQL数组到CLOB

  •  3
  • guigui42  · 技术社区  · 14 年前

    我正在使用Oracle9i。

    我正在将数据从光标提取到数组中:

    FETCH contract_cur 
            BULK COLLECT INTO l_contract ;
    

    但现在我想“转换”这个 转换为CLOB变量

    有没有一个简单的方法?

    谢谢

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Gary Myers    14 年前

    这是一件多么丑恶的事啊。

    是所有字符数据,还是也有数字和/或日期/时间值?如果是这样,当您将这些数据类型转换为字符串时,您希望对它们使用什么格式。

    您可能还需要考虑字段和记录分隔符。

    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;
    /
    
        2
  •  2
  •   Vincent Malgrat    14 年前

    您可以在阵列中循环并在运行时构建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