我使用的是oracle verion 10。PL/SQL中有一个使用varchar2变量的存储过程。代码不断地附加varchar2变量。当varchar2变量大小超过32767时,它不能再追加任何值。现在我想将数据类型更改为long或clob(为了容纳更多的字符),但它不起作用。如何修改这里的代码,使其具有与clob或long相同的附加功能?
样品附加x: =x||'mydata';
不赞成使用long
数据类型;如果可以的话,您应该认真考虑将long
列迁移到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
参数,但我认为您所描述的情况并非如此。