The long
数据类型已弃用;如果可以的话你应该认真考虑迁移你的long列到一个clob.
如果您正在与clob
你可以追加超过 32kvarchar2
像这样限制:
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
与连接运算符||
,但正如您已经看到的,最多只有 32k。没有简单的方法可以处理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
否则,对于调用者而言,该对象将不存在。
If the clob
存在 - 从表中选择,例如,所以你不需要createtemporary
调用 - 然后你可以将它分配给out
参数,但我认为您所描述的情况并非如此。