long 数据类型已弃用;如果可以的话,你应该认真考虑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,但正如您已经看到的那样,最多只能达到32k。在 PL/SQL 中没有简单的方法来处理高于该值的 long 值。你也许可以用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 参数,但我不认为这是你所描述的情况。