PL / SQL Array to CLOB - PullRequest
       15

PL / SQL Array to CLOB

3 голосов
/ 19 февраля 2010

Я использую Oracle 9i.

Я извлекаю данные из курсора в массив:

FETCH contract_cur 
        BULK COLLECT INTO l_contract ;

Но теперь я хочу "преобразовать" это l_contract в переменную CLOB l_clob

Есть ли простой способ сделать это?

Или иначе, как мне преобразовать строки из оператора SELECT в одну переменную CLOB?

спасибо

РЕДАКТИРОВАТЬ: я забыл упомянуть, что это массив% ROWTYPE, а не только один столбец.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2010

Какая ужасная вещь.

Это все символьные данные, или у вас тоже есть числовые значения и / или значения даты / времени? Если да, то какой формат вы хотите использовать для этих типов данных при преобразовании их в строки.

Вам также может понадобиться подумать о разделителях полей и записей.

Рассматривали ли вы 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;
/
2 голосов
/ 19 февраля 2010

вы можете циклически проходить по вашему массиву и создавать 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
...