将超过 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