在oracle SP中用更大的数据类型替换varchar2



我使用的是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参数,但我认为您所描述的情况并非如此。

最新更新