2013-05-10 93 views
14

我試圖通過dbms_output調試我的動態查詢,但似乎查詢字符串對於dbms_output緩衝區來說太長。如何增加dbms_output緩衝區?

我:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 
ORA-06512: at "SYS.DBMS_OUTPUT", line 148 
ORA-06512: at line 1 

任何想法如何增加緩衝區的大小?

+5

您可能正在使用dbms_output編寫太多的信息。它不是爲此設計的。 – 2013-05-10 07:40:15

+0

@a_horse_with_no_name:我從來不喜歡使用數據庫表作爲應用程序日誌,因爲可能出現不可登錄的事件:例如,如果應用程序可以' t連接到數據庫在哪裏記錄日誌在數據庫中無法連接時應用程序無法連接的事實?我更喜歡將日誌寫入平面文件(使用PL/SQL中的UTL_FILE包),因此IMO不太可能比數據庫中的表不可用。因人而異。分享並享受。 – 2013-05-10 12:59:30

+0

@BobJarvis:在PL/SQL過程中,我認爲這非常合理。對於常規應用程序代碼(Java,C#,...),我確實同意你的看法。 – 2013-05-10 13:06:24

回答

25

您可以啓用DBMS_OUTPUT並設置緩衝區大小。緩衝區大小可以在1到1,000,000之間。

dbms_output.enable(buffer_size IN INTEGER DEFAULT 20000); 
exec dbms_output.enable(1000000); 

檢查this

編輯

按照發布由弗蘭克和Mat的評論,你也可以用空

exec dbms_output.enable(NULL); 

BUFFER_SIZE啓用它:上限,在中tes,緩衝的信息量。將buffer_size設置爲NULL指定應該沒有限制。最大大小爲1,000,000,當用戶指定buffer_size(NOT NULL)時,最小值爲2,000。

+0

我收到相同的錯誤。它沒有工作。無論如何,謝謝 – hsuk 2013-05-10 07:10:06

+0

嘗試禁用dbms_output,然後以最大大小啓用它 – 2013-05-10 07:12:36

+5

您也可以調用dbms_output.enable(NULL),它將緩衝區大小設置爲無限制,請參見http://docs.oracle.com/cd/B19306_01 /appdev.102/b14258/d_output.htm#i999293 – 2013-05-10 07:32:50

3

當緩衝區大小變滿時。有幾個選項,你可以嘗試:

1)增加DBMS_OUTPUT緩衝區的大小1,000,000

2)儘量過濾寫入緩衝區中的數據 - 可能有一個循環,寫入DBMS_OUTPUT和你做不需要這些數據。

3)在代碼中的各個檢查點調用ENABLE。每次呼叫都會清除緩衝區。

DBMS_OUTPUT.ENABLE(NULL)將默認爲20000的向後兼容性Oracle documentation on dbms_output

您還可以創建自定義輸出display.something像下面網頁摘要

create or replace procedure cust_output(input_string in varchar2) 
is 

    out_string_in long default in_string; 
    string_lenth number; 
    loop_count number default 0; 

begin 

    str_len := length(out_string_in); 

    while loop_count < str_len 
    loop 
     dbms_output.put_line(substr(out_string_in, loop_count +1, 255)); 
     loop_count := loop_count +255; 
    end loop; 
end; 

鏈接-Ref:Alternative to dbms_output.putline @通過:亞歷山大

+3

DBMS_OUTPUT.ENABLE(NULL)與省略參數不同。 Oracle文檔(請參閱鏈接)明確指出:「buffer_size 緩衝區信息的上限(以字節爲單位)。將buffer_size設置爲NULL指定不應有限制。 – 2013-05-10 08:44:27

+0

我認爲你需要改變這個過程:'創建或替換過程FRE_OUTPUT_REPLACE(input_string in varchar2) 是 out_string_in long default input_string; string_lenth number; loop_count number default 0; begin string_lenth:= length(out_string_in); while(loop_count uzay95 2014-04-05 20:00:05

0

這裏你去:

DECLARE 
BEGIN 
    dbms_output.enable(NULL); -- Disables the limit of DBMS 
    -- Your print here ! 
END;