将超过 32K 的字符串分配给 clob 变量时出现数字或值错误

Posted

技术标签:

【中文标题】将超过 32K 的字符串分配给 clob 变量时出现数字或值错误【英文标题】:Numeric or value error when assigning more than 32K string to a clob variable 【发布时间】:2017-01-21 05:37:28 【问题描述】:

当我尝试执行以下操作时,我收到了数字或值错误。我正在尝试将 40000 长度的字符串分配给 clob 变量,它应该允许我吗?

如果尝试追加字符串块,我是一个循环,那么没有问题,但是如果我尝试一次性分配“超过 32K 的字符串”,那么就会出现错误。

我有一个要求,我必须将 32K+ 字符串分配给带有 clob 输入参数的过程。

SET SERVEROUTPUT ON

DECLARE

my_var CLOB;

BEGIN

my_var:=RPAD('*',40000,'*');

DBMS_OUTPUT.PUt_LINE(length(my_var));

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUt_LINE(SQLCODE||' '||SQLERRM);

END;

错误:

-6502 ORA-06502: PL/SQL: 数值或数值错误: 字符串缓冲区太小

【问题讨论】:

【参考方案1】:

设身处地为 PL/SQL 运行时着想。它必须处理分配

my_var := rpad('*', 40000, '*')

没错,my_var 被声明为 clob。 RHS 怎么样?首先必须评估 RHS,当运行时这样做时,它无法知道预期的结果是 clob。第一个参数是'*',它是varchar2,而不是clob。那么,来自rpad 的返回预计为varchar2。这就是您收到错误的原因。

我们如何解决这个问题?容易地。您需要给函数一个clob 作为第一个参数。像这样:

my_var := rpad(to_clob('*'), 40000, '*')

演示:

SQL> declare x clob; begin x := rpad(to_clob('*'), 40000, '*');
  2  dbms_output.put_line(length(x)); end;
  3  /

40000

PL/SQL procedure successfully completed.

祝你好运!

【讨论】:

您好,感谢您的回答。我有一个程序,它使用 clob 作为输入参数写入 clob 列。由于 plsql 中的字符串有 32K 的限制。 Unix shell 脚本将通过 sqllpus 调用这个过程,并给出可以是“超过 32K”的字符串参数。就像先将这个大字符串分配给一个 clob 变量,然后将此 clob 变量传递给过程一样。是否可以??请帮忙。

以上是关于将超过 32K 的字符串分配给 clob 变量时出现数字或值错误的主要内容,如果未能解决你的问题,请参考以下文章

插入 CLOB 列时出错:ORA-06502:PL/SQL:数字或值错误

no_data_found 时出现异常,我想将两个变量分配给 null

oracle 字符串连接的结果过长的问题怎么解决

在 PL/SQL 中插入 clob 数据时出错

“在将哈希分配给 perl 中的哈希时,“不能使用字符串 (””) 作为哈希引用,而“严格引用”在使用时出现错误

oracle 导出超长Clob字段insert语句执行报字段过长的问题解决方案