【问题标题】:ORU-10027: buffer overflow, limit of 100000 bytesORU-10027:缓冲区溢出,限制为 100000 字节
【发布时间】:2021-04-01 11:22:45
【问题描述】:

在 PL/SQL 中生成 100k 记录时出现以下错误。我创建了一个包并从匿名块调用该包。

Error report -
ORA-20000: ORU-10027: buffer overflow, limit of 100000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 97
ORA-06512: at "SYS.DBMS_OUTPUT", line 112
ORA-06512: at "APPS.PJM_ECC_DATA_POPULATION", line 126
ORA-06512: at line 13
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
           was called which causes this error to be generated.

我正在使用下面的行来打印日志

dbms_output.put_line('After pjm_project_params_pkg.insert_row: Row ID: ' || l_rowid);

我已经阅读了一些答案,他们建议在下面使用。

DBMS_OUTPUT.ENABLE(1000000)

我不知道我应该把同样的东西放在什么地方?它会解决问题吗? 我把下面放在我的匿名块中,但它没有帮助

set serveroutput on size 1000000

【问题讨论】:

  • 你不能把“设置服务器输出”放在一个包里。它必须在客户端应用程序的 sqlplus 会话中设置
  • DBMS_OUTPUT.ENABLE() 将在 BEGIN 之后和对 DBMS_OUTPUT.PUT_LINE 的任何调用之前进入您的代码块。但你真正的问题是试图输出太多的文本。我只会在您想要跟踪的一小部分代码中使用它。另一种选择是插入到日志表中。
  • 如果您在 Oracle 10.2 或更高版本中,您可以使用“set serveroutput on size unlimited”或“set serveroutput on”,这不应该在生产环境中完成,因为它会给你 ORA-0403 如果你超过了记忆。另一种选择是子串并显示一个较小的字符串。

标签: sql database oracle plsql oracle11g


【解决方案1】:

如果记录到服务器端文件是一个选项,那么 UTL_FILE 是最好的选择。它不会抱怨缓冲区溢出。

DECLARE 
  v_MyFileHandle UTL_FILE.FILE_TYPE;
  BEGIN

      --Change the folder based on host operating System
      
       v_MyFileHandle := UTL_FILE.FOPEN('C:\','LOG.TXT','a');

      FOR i in 1..1000000
      LOOP 
       UTL_FILE.PUT_LINE(v_MyFileHandle, ' Record written to file  at ' || TO_CHAR(SYSDATE,'MM-DD-YY HH:MI:SS AM')||' is '||i);
      END LOOP;
      
      UTL_FILE.FCLOSE(v_MyFileHandle);
       
 EXCEPTION
      WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE
                ('ERROR ' || TO_CHAR(SQLCODE) || SQLERRM);
 END; 

您可以在只读模式下打开文件,并且可以在脚本运行时看到写入记录的进度。这是一个奖励。

更多值得阅读 oracle 文档的细节:https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS72681

【讨论】:

    【解决方案2】:

    如果您超出了 DBMS_OUTPUT 的限制,您可能应该使用日志表来记录您的跟踪消息。

    作为 Oracle 内置库,DBMS_OUTPUT 具有可用性优势。这是它唯一的优势。它的输出很难搜索,这是一个与输出大小成对数的问题。它不是持久的。在其他环境中管理起来很麻烦。

    不幸的是,Oracle 不提供 PL/SQL 记录器实用程序,但您不必编写自己的(除非您愿意)。使用 Tyler Muth 的第三方库。这是我们拥有的最接近行业标准的东西。 Find it on GitHub.

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2018-04-28
      • 2013-11-06
      相关资源
      最近更新 更多