我使用的是 oracle 版本 10。 PL/SQL 中有使用 varchar2 变量的存储过程。 该代码不断附加 varchar2 变量。 当varchar2变量大小超过32767时,它不能再附加任何值。 现在我想将数据类型更改为long或clob(为了容纳更多字符),它不起作用。 如何修改此处的代码以具有与 clob 或 long 相同的附加功能?
示例附加 x:= x || '我的数据';
最佳答案
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
参数,但我认为您所描述的情况并非如此。
关于oracle - 在oracle SP中用更大的数据类型替换varchar2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354503/