oracle 如何解决:ORA-06502:PL/SQL:数字或值错误?

nlejzf6q  于 2023-02-21  发布在  Oracle
关注(0)|答案(2)|浏览(307)

我在CLOB中有一个很长的文本,我正在尝试使用函数htp.prn
下面是我的代码:

n := dbms_lob.getlength(html);      -- n is 31745 characters

if n<32000 then
    htp.prn(HTML);                  -- << Error raised here 
else
    do something else
end if;

当使用函数htp. prn时,我得到错误:* * ORA-06502:PL/SQL:数字或值错误**
我知道允许的文本大小是32672个字符。并且文本包含一些中文字符。因此,我假设问题来自dbms_lob. getlength
有人知道怎么解吗?
谢谢干杯

ha5z0ras

ha5z0ras1#

如果您有Unicode字符(您提到了中文),并且数据库使用多字节字符集,那么字节数大于字符数。32767是 bytes 的硬限制。而用于CLOB和NCLOB的dbms_lob.getlength计数 characters。因此您可能超过了32K的字节数限制。
您无法轻松地获得CLOB的字节长度。有各种各样令人不快的变通方法,但对您来说最简单的事情可能是捕获异常,而不是预测异常:

n := dbms_lob.getlength(html);

if n<32000 then
    declare
      value_error exception;
      pragma exception_init(value_error,-06502);
    begin
      htp.prn(HTML);
    exception
       when value_error then
         null;
    end;
else
    do something else
end if;
q8l4jmvw

q8l4jmvw2#

多字节字符,嗯?
也许您可以通过将 string 拆分为更小的块来处理它。
我的例子使用了 * 而不是那个长字符串 *,然后将其拆分为20个字符,我只是显示它们(第10行);你会htp.prn它(第11行)。

SQL> set serveroutput on
SQL> declare
  2    html   clob := 'How to solve: ORA-06502: PL/SQL: numeric or value error';
  3    l_var  varchar2(20);  --> you'd use e.g. 5000
  4    l_size number := 20;  --> you'd use e.g. 5000
  5    l_pos  number := 1;
  6  begin
  7    while dbms_lob.getlength(html) >= l_pos
  8    loop
  9      l_var := dbms_lob.substr(html, l_size, l_pos);
 10      dbms_output.put_line(l_var);
 11      htp.prn(l_var);
 12      l_pos := l_pos + length(l_var);
 13    end loop;
 14  end;
 15  /
How to solve: ORA-06
502: PL/SQL: numeric
or value error

PL/SQL procedure successfully completed.

SQL>

相关问题