Тип данных long
устарел; если вы можете, вам следует серьезно подумать о миграции столбца long
в clob
а>.
Если бы вы работали с clob
, вы могли бы добавить varchar2
за пределы 32k varchar2
следующим образом:
declare
l_clob clob;
begin
dbms_lob.createtemporary(l_clob, true);
dbms_lob.open(l_clob, dbms_lob.lob_readwrite);
dbms_lob.writeappend(l_clob, 4, '1234');
for i in 1..10000 loop
dbms_lob.writeappend(l_clob, 5, '.5678');
end loop;
dbms_output.put_line('CLOB length: ' || length(l_clob));
dbms_lob.close(l_clob);
dbms_lob.freetemporary(l_clob); end;
/
CLOB length: 50004
Вы можете добавить к long
оператор конкатенации ||
, но, как вы уже видели, только до 32 КБ. Не существует простого способа обработки значений long
выше, чем в PL/SQL. Возможно, вы сможете что-то сделать с dbms_sql
, но на самом деле это не будет стоить усилий, если есть возможность переключить столбец таблицы на clob
.
Если вы хотите передать clob обратно вызывающему, и это временный clob, он должен быть определен вызывающим абонентом и передан после его создания:
create or replace procedure proc1 as
l_clob clob;
begin
dbms_lob.createtemporary(l_clob, true);
proc2(l_clob);
dbms_output.put_line('proc1 CLOB length: ' || length(l_clob));
dbms_lob.freetemporary(l_clob);
end;
/
create or replace procedure proc2(p_clob in out clob) as
begin
dbms_lob.open(p_clob, dbms_lob.lob_readwrite);
dbms_lob.writeappend(p_clob, 5, '12345');
for i in 1..9999 loop
dbms_lob.writeappend(p_clob, 5, '.56789');
end loop;
dbms_output.put_line('proc2 CLOB length: ' || length(p_clob));
dbms_lob.close(p_clob);
end;
/
exec procs;
proc2 CLOB length: 50000
proc1 CLOB length: 50000
В противном случае объект не будет существовать для вызывающего объекта.
Если clob
существует - выбрано, скажем, из таблицы, поэтому вам не нужен вызов createtemporary
- тогда вы можете просто назначить его параметру out
, но я не думаю, что это относится к тому, что вы описали.
person
Alex Poole
schedule
28.06.2013
long
уже давно (без каламбура) объявлен устаревшим и имеет ограничения. Придерживайтесьclob
. - person Alex Poole   schedule 28.06.2013clob
решения и вообще не должны рассматриватьlong
. Я не имел в виду, что вы можете конкатенировать, как вы можете сvarchar2
. Вам может понадобитьсяdbms_lob.writeappend()
, но я m в настоящее время не могу опубликовать больше, чем ответ только по ссылке ... - person Alex Poole   schedule 28.06.2013