2

我正在使用 oracle 版本 10。PL/SQL 中有使用 varchar2 变量的存储过程。该代码不断附加 varchar2 变量。当 varchar2 变量大小超过 32767 时,它不能再追加任何值。现在我想将数据类型更改为 long 或 clob(以容纳更多字符),它不起作用。如何在此处修改代码以具有与 clob 或 long 相同的附加功能?

附加 x:= x || 的示例 '我的数据';

4

1 回答 1

2

数据类型已long弃用;如果可以的话,您应该认真考虑将您的列迁移longclob.

如果您正在使用 a ,则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您可以使用连接运算符附加到 a ||,但正如您已经看到的那样,最多只能达到 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参数,但我认为您所描述的情况并非如此。

于 2013-06-28T07:40:13.743 回答