在 oracle SP 中用更大的数据类型替换 varchar2
Posted
技术标签:
【中文标题】在 oracle SP 中用更大的数据类型替换 varchar2【英文标题】:Replacing varchar2 with bigger data type in oracle SP 【发布时间】:2013-06-27 22:47:45 【问题描述】:我正在使用 oracle 版本 10。 PL/SQL 中有一个使用 varchar2 变量的存储过程。 该代码不断附加 varchar2 变量。 当 varchar2 变量大小超过 32767 时,它不能再追加任何值。 现在我想将数据类型更改为 long 或 clob(以容纳更多字符),它不起作用。 如何修改此处的代码,使其具有与clob或long相同的附加功能?
示例附加 x:= x || '我的数据';
【问题讨论】:
long
已被弃用很长时间(没有双关语),并且有限制。坚持clob
。
@AlexPoole,我通过将数据类型更改为 clob 进行测试,它不起作用。
我的意思是您应该寻找clob
解决方案,根本不应该考虑long
。我并不是说你可以像varchar2
那样连接。您可能想要dbms_lob.writeappend()
,但我目前只能发布仅链接的答案...
【参考方案1】:
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
参数,但我不认为这是你所描述的情况。
【讨论】:
谢谢@Alex,很有帮助,我只想知道如何从这个 clob 返回值。 @user215005 - 返回到哪里,如何返回?您是在尝试从 proc 插入/更新long
列,还是将值传递回将执行插入/更新的客户端?
这是一个从另一个 SP 调用的带有 out 参数的 SP。所以需要将 clob var 的值返回给被调用的 SP
@user215005 - 输出参数是clob
还是long
,甚至是varchar2
?它需要是 clob
才能工作,在调用者中有 createtemporary
等。但是它是否仍然必须在某个时候变成long
,这在PL/SQL 中将是困难和不可能之间的某个地方,还是现在也将它存储为clob
?在您的问题中显示整个过程、数据类型以及每一步的客户端/语言是什么会很有用。将列更改为 clob
确实是唯一可行的策略。
我同意你的观点@Alex,out 参数目前很长,我正在改变它。只是想知道如何将临时 clob 值分配给这个输出参数。以上是关于在 oracle SP 中用更大的数据类型替换 varchar2的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - 如何检查多条记录中的值以及一个值是不是匹配 - 将其用于更大的数据集