将大字符串值设置为 CLOB 时引发"PLS-00172:字符串文本太长"错误



我有一个存储过程,它有一个CLOB字段。当我调用具有大值(超过33K个字符(的存储过程时;PLS-00172:字符串文字太长";

我的存储过程

create or replace procedure P(c clob) is
begin
dbms_output.put_line('dbms_lob.getlength(c)');
end;

调用存储过程

declare
C CLOB := 'large text over 33k characters';
begin
P(C => C);
end;
/

问题:

"PLS-00172:字符串文字太长";调用存储过程时引发错误

'<文本>'是一个varchar2-Literal,然后自动转换为CLOB。要将一个大的文本转换为clob,您可以将其拆分为不同的部分,然后将它们连接起来:

declare
c clob := TO_CLOB('First 32k characters')||TO_CLOB('Second 32k characters')||...;
begin
P(C => C);
end;
/

很抱歉,但Oracle不允许在字符串文字中键入超过32K个符号(字符串文字是指介于两个撇号之间的所有符号(。

你必须把它分开才能以这种方式进行。

declare
C CLOB;
begin
c := 'a long string literal';
c := c || 'another long string literal';
P(C => C);
end;
//Output is: 63058

我建议你先阅读一些clob列中的数据

PS。请记住,您的程序P将打印一个字符串";dbms_lob.getLength(c("而不是打印变量c的长度。您需要删除撇号。

dbms_output.put_line(dbms_lob.getlength(c));

最新更新