本文介绍了Oracle - ORA-06502: PL/SQL: 数字或值错误 (DBMS_OUTPUT)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I implemented a function that returns clob data-type, and I would like to print the result in DBMS Output. Unfortunately, I am getting ORA-06502: PL/SQL: numeric or value error and I think it is due to the size of 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,但是没有用..

Here are something that can help you to understand this issue
1) Added the following to set the size of buffer unlimited, but did not work..

DBMS_OUTPUT.ENABLE(NULL);

set serveroutput on size unlimited;

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

2)注意vr_output_str的大小是75387,这就是为什么返回类型是CLOB.

Related link: http://www.oracle-developer.net/display.php?id=327

2) It is noted that the size of vr_output_str is 75387, and that is why the return type is CLOB.

DBMS_LOB.getlength(vr_output_str); // =75387

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

3) I can solve the issue by doing the following, but I think this is not a good solution since it executed the function three times.

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

推荐答案

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

You will not be able to print a clob using dbms_output.put_line directly if it is greater than 32767 bytes.

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

If this is the case you can create a procedure to iterate through the clob and print out one smaller chunk at a time. Such a procedure and test script is below:

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).

Note that v_chunk_size must result in less than 32767 bytes being chunked at-a-time. If you encoding has 2 bytes per char you will need to use (32767/2).

这篇关于Oracle - ORA-06502: PL/SQL: 数字或值错误 (DBMS_OUTPUT)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 21:40