ORU-10027: 缓冲区溢出,限制为 100000 字节

ORU-10027: buffer overflow, limit of 100000 bytes

我在 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

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

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

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

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

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; 

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

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