【问题标题】:Oracle - ORA-06502: PL/SQL: numeric or value error (DBMS_OUTPUT)Oracle - ORA-06502:PL/SQL:数字或值错误 (DBMS_OUTPUT)
【发布时间】:2014-12-30 15:32:34
【问题描述】:

我实现了一个返回 clob 数据类型的函数,我想在 DBMS 输出 中打印结果。不幸的是,我收到 ORA-06502: PL/SQL: numeric or value error,我认为这是由于 DBMS_OUTPUT 的大小造成的。

这是代码。

DECLARE

    TYPE tp_col_array IS TABLE OF varchar2(32767); 
    FUNCTION my_fn (        
        p_in_proc_date IN varchar2)
        RETURN clob AS         
         vr_output_str clob;

        BEGIN            

        -- Detailed code hidden due to privacy. Sorry

        RETURN vr_output_str;

        EXCEPTION 
            WHEN LOGIN_DENIED
            THEN 
                DBMS_OUTPUT.PUT_LINE('Invalid username/password: logon denied');
        RETURN 'TEST Terminated';

    END my_fn;

BEGIN
    DBMS_OUTPUT.PUT_LINE(my_fn('31-AUG-14'));    
END;

这里有一些东西可以帮助你理解这个问题
1) 添加以下设置缓冲区的大小unlimited,但不起作用..

DBMS_OUTPUT.ENABLE(NULL);

set serveroutput on size unlimited;

相关链接:http://www.oracle-developer.net/display.php?id=327

2)注意到vr_output_str的大小是75387,所以返回类型是CLOB

DBMS_LOB.getlength(vr_output_str); // =75387

3)我可以通过执行以下操作来解决问题,但我认为这不是一个好的解决方案,因为它执行了三次该功能。

DBMS_OUTPUT.PUT_LINE(SUBSTR(my_fn ('31-AUG-14'), 1, 32767));
DBMS_OUTPUT.PUT_LINE(SUBSTR(my_fn ('31-AUG-14'), 32768, 32767));
DBMS_OUTPUT.PUT_LINE(SUBSTR(my_fn ('31-AUG-14'), 65536, 32767));

4) 我正在使用 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

【问题讨论】:

标签: oracle plsql oracle11g dbms-output


【解决方案1】:

如果 clob 大于 32767 字节,您将无法直接使用 dbms_output.put_line 打印它。

如果是这种情况,您可以创建一个过程来遍历 clob 并一次打印出一个较小的块。这样的程序和测试脚本如下:

declare 

  c clob;

  procedure print_clob( p_clob in clob ) is
      v_offset number default 1;
      v_chunk_size number := 10000;
  begin
      loop
          exit when v_offset > dbms_lob.getlength(p_clob);
          dbms_output.put_line( dbms_lob.substr( p_clob, v_chunk_size, v_offset ) );
          v_offset := v_offset +  v_chunk_size;
      end loop;
  end print_clob;


begin
  for i in 1..10000 loop
     c := c || 'test';
  end loop;
  --This will result in ora-06502
  --dbms_output.put_line(c);

  print_clob(c);

end;

请注意,v_chunk_size 每次分块的字节数必须少于 32767。如果您编码每个字符有 2 个字节,则需要使用 (32767/2)。

【讨论】:

    【解决方案2】:

    下面的过程会更好:

    • Oracle 10g 对 put_line 有限制(最多 32767 个字符),但是 10g 之前的 Oracle 有最多 255 个字符的限制。
    • 'put_line' 在输出 clob 期间在每个迭代循环中添加行尾。所以我们更好地使用 put()(最后是 'DBMS_OUTPUT.NEW_LINE')。
    程序 print_clob( p_clob in clob ) 是 v_offset number 默认1; v_chunk_size 数量:= 255; 开始 环形 当 v_offset > dbms_lob.getlength(p_clob) 时退出; dbms_output.put(dbms_lob.substr(p_clob, v_chunk_size, v_offset)); v_offset := v_offset + v_chunk_size; 结束循环; DBMS_OUTPUT.NEW_LINE; 结束打印_clob;

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多