調試存儲過程時提示ORA-20000: ORU-10027: buffer overflow

下午的時候在 PL/SQl Developer 10.0.5.1710 上調試壹個存儲過程,在調試的時候使用了比較多的 DBMS_OUTPUT.PUT_LINE 做爲打印日誌的方式,結果沒過多久 PLSQL 客戶端就開始提示以下錯誤:ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes,分析下來是由於函數DBMS_OUTPUT.PUT_LINE()是在循環體中打印結果的,所以,循環執行多少次,這個函數就會執行多少次,致使緩衝區很快爆滿。具體的錯誤信息以下圖所示。 sql

因而果斷 Google 了關鍵字"ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes",查詢結果的前兩條就是來自 Oracle Forum 論壇的解決方法。兩個連接分別是https://community.oracle.com/message/977489https://community.oracle.com/thread/308557 ,解決的方法也很簡單,就是在咱們的存儲過程的方法體開始的時候增長以下內容:DBMS_OUTPUT.ENABLE(1000000); 使輸出的緩衝區的容量達到壹千萬個字節,這樣就不怕它的容量爆表了。具體的參考代碼以下所示: oracle

CREATE OR REPLACE PROCEDURE SAMPLE_PROC
IS
--各類臨時變量和遊標的定義
	CURSOR CURSOR_SAMPLE IS SELECT ... FROM TABLE_NAME WHERE ...;
BEGIN
	--方法體從這裏開始
	DBMS_OUTPUT.ENABLE(1000000);
	FOR I IN CURSOR_SAMPLE	LOOP
		--輸出語句樣例
		DBMS_OUTPUT.PUT_LINE(...);
	END LOOP;
	--其它內容
END;
/
若是是在命令行下編寫存儲過程,能夠直接使用語句 SET SERVEROUTPUT ON size '1000000'; 來設置緩衝區的最大容量。
固然,若是你須要輸出的日誌容量真的很大,建議仍是不要使用 DBMS_OUTPUT,而是使用 UTL_FILE 輸出到指定的日誌文件,詳細的參考樣例見於 http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_file.htm#ARPLS70903 ,後者基於 UNIX 系統,不過也能夠很容易的照搬到 Windows 平臺。
相關文章
相關標籤/搜索