long
datatype устарел; если вы можете серьезно подумать, migrating your long
column to a clob
.
Если вы работали с clob
вы могли бы добавить мимо 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
параметра, но я не думаю, что это дело за то, что» описал.
'long' устарел для длительного (не предназначенного для каламбур) времени и имеет ограничения. Придерживайтесь 'clob'. –
@AlexPoole, я проверил, изменив тип данных на clob, это не сработало. – user215005
Я просто хотел, чтобы вы искали решения 'clob' и не должны были рассматривать' long' вообще. Я не имел в виду, что вы можете объединиться, как вы можете, с помощью varchar2. Возможно, вы захотите ['dbms_lob.writeappend()'] (http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999705), но я в настоящее время не могу опубликовать больше чем ответ только для ссылок ... –