2013-05-10 11 views
14

Ich habe versucht, meine dynamische Abfrage über dbms_output debuggen, aber scheint, wie die Abfragezeichenfolge für dbms_output Puffer zu lang ist.Wie dbms_output Puffer zu erhöhen?

Ich habe:

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 

Jede Idee, wie die Puffergröße zu erhöhen?

+5

Wahrscheinlich schreiben Sie viel zu viele Informationen mit dbms_output. Es ist nicht dafür ausgelegt. Ihre beste Option ist wahrscheinlich, diese Nachrichten in eine Tabelle einzufügen und anschließend aus der Tabelle auszuwählen. –

+0

@a_horse_with_no_name: Ich habe nie die Verwendung einer Datenbanktabelle als Anwendungsprotokoll aufgrund möglicherweise nicht protokollierbarer Vorfälle befürwortet, z. t Stellen Sie eine Verbindung zur Datenbank her, in der Sie protokollieren, dass die App keine Verbindung herstellen kann, wenn sich das Protokoll in der Datenbank befindet, mit der Sie keine Verbindung herstellen können? Ich bevorzuge das Schreiben von Protokollen in flache Dateien (mit dem UTL_FILE-Paket in PL/SQL), was IMO weniger wahrscheinlich unbrauchbar als eine Tabelle in einer Datenbank ist. YMMV. Teile und genieße. –

+0

@BobJarvis: in einem PL/SQL-Verfahren denke ich, dass dies vollkommen sinnvoll ist. Für normalen Anwendungscode (Java, C#, ...) stimme ich Ihnen zu. –

Antwort

25

Sie können DBMS_OUTPUT aktivieren und die Puffergröße festlegen. Die Puffergröße kann zwischen 1 und 1.000.000 liegen.

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

prüfen this

EDIT

Gemäß der Kommentar geschrieben von Frank und Mat, können Sie auch mit Null ermöglichen es

exec dbms_output.enable(NULL); 

buffer_size: Obergrenze, in by tes, die Menge der gepufferten Informationen. Wenn buffer_size auf NULL gesetzt wird, gibt es keine Begrenzung. Die maximale Größe beträgt 1.000.000 und der Mindestwert 2.000, wenn der Benutzer buffer_size (NOT NULL) angibt.

+0

Ich bekomme den gleichen Fehler. Es hat nicht funktioniert.Wie auch immer, danke – hsuk

+0

versuchen Sie die dbms_output deaktivieren und aktivieren Sie es dann mit der maximalen Größe –

+5

Sie können auch dbms_output.enable (NULL) aufrufen, die die Puffergröße auf unbegrenzte setzen wird, siehe http://docs.oracle.com/cd/B19306_01 /appdev.102/b14258/d_output.htm#i999293 –

3

Wenn die Puffergröße voll ist. Es gibt mehrere Optionen, die Sie ausprobieren können:

1) Erhöhen Sie die Größe des DBMS_OUTPUT Puffer zu 1.000.000

2) Versuchen Sie, die Datenfilterung in den Puffer geschrieben - möglicherweise gibt es eine Schleife, die zu DBMS_OUTPUT schreibt und Sie tun brauche diese Daten nicht.

3) Rufen Sie ENABLE an verschiedenen Kontrollpunkten in Ihrem Code auf. Jeder Anruf löscht den Puffer.

DBMS_OUTPUT.ENABLE (NULL) wird für die Abwärtskompatibilität zu 20.000 Standard Oracle documentation on dbms_output

Sie können auch Ihre eigene Ausgabe erstellen wie display.something unten Schnipsel

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; 

Link--Ref: Alternative to dbms_output.putline @ By : Alexander

+3

DBMS_OUTPUT.ENABLE (NULL) ist nicht identisch mit dem Auslassen des Parameters. Die Oracle-Dokumentation (siehe den Link) gibt eindeutig an: "buffer_size Obere Grenze, in Bytes, die Menge der gepufferten Informationen. Einstellung buffer_size auf NULL gibt an, dass es keine Grenze geben sollte." –

+0

Ich denke, dass Sie Prozedur mit diesem ändern müssen: 'Prozedur erstellen oder ersetzen FRE_OUTPUT_REPLACE (Eingabezeichenfolge in Varchar2) ist out_string_in long default input_string; string_lenth Nummer; loop_count Nummer Standard 0; beginnen string_lenth: = Länge (out_string_in); while loop_count uzay95

0

Hier gehen Sie:

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