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