In diesem Artikel untersuchen wir DBMS_OUTPUT
Paket im Detail. DBMS_OUTPUT
Das Paket in Oracle gehört wie andere DBMS-Pakete dem Oracle-Benutzer SYS
.
Das Skript, das DBMS_OUTPUT
erstellt erteilt PUBLIC die EXECUTE-Berechtigung für das Paket und erstellt ein öffentliches Synonym dafür. Das bedeutet, dass jeder Oracle-Benutzer die Routinen in DBMS_OUTPUT
aufrufen kann ohne dem Paketnamen SYS
voranstellen zu müssen .
Wie funktioniert DBMS_OUTPUT in Oracle?
Zwei grundlegende Operationen, GET
und PUT
, werden durch Prozeduren im Paket implementiert. Ein PUT
Die Operation nimmt ihr Argument und legt es zur Speicherung in einem internen Puffer ab.
Ein GET
Die Operation liest aus diesem Puffer und gibt den Inhalt als Argument an die Prozedur zurück. Es gibt auch ein ENABLE
Prozedur, die die Größe des Puffers festlegt.
Prozeduren im DBMS_OUTPUT-Paket
Der PUT
Routinen im Paket sind PUT
, PUT_LINE
, und NEW_LINE
. Der GET
Routinen sind GET_LINE
und GET_LINES
. Steuerung des Puffers AKTIVIEREN und DEAKTIVIEREN.
PUT und PUT_LINE Die Syntax für die PUT- und PUT_LINE-Aufrufe lautet:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Wobei a das Argument ist, das in den Puffer gestellt werden soll. Beachten Sie, dass der Typ des Parameters diese Prozeduren überlädt. Wegen der drei verschiedenen Versionen von PUT
und PUT_LINE
, kann der Puffer Werte vom Typ VARCHAR2
enthalten , NUMBER
, und DATE
werden in ihrem ursprünglichen Format im Puffer gespeichert. Allerdings GET_LINE
und GET_LINES
aus dem Puffer abrufen und nur Zeichenketten zurückgeben.
Wenn ein GET
Operation ausgeführt wird, wird der Inhalt des Puffers gemäß den standardmäßigen Datentypkonvertierungsregeln in eine Zeichenkette konvertiert. Wenn Sie ein Format für die Konvertierung angeben möchten, verwenden Sie einen expliziten TO_CHAR
Rufen Sie PUT
auf , anstatt GET
.
Der Puffer ist in Zeilen organisiert, die jeweils maximal 255 Byte umfassen können. PUT_LINE
hängt nach seinem Argument ein Zeilenumbruchzeichen an, das das Ende einer Zeile signalisiert. PUT
nicht. PUT_LINE
entspricht dem Aufruf von PUT
und dann NEW_LINE
aufrufen .
NEW_LINE Die Syntax für den NEW_LINE-Aufruf lautet:
PROCEDURE NEW_LINE;
NEW_LINE
fügt ein Newline-Zeichen in den Puffer ein und signalisiert das Ende einer Zeile. Die Anzahl der Zeilen im Puffer ist unbegrenzt. Die Gesamtgröße des Puffers ist jedoch auf den in ENABLE angegebenen Wert begrenzt.
GET_LINE Die Syntax für GET_LINE ist:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Wobei die Zeile eine Zeichenfolge ist, die eine Zeile des Puffers enthält, und der Status angibt, ob die Zeile erfolgreich abgerufen wurde. Die maximale Länge einer Zeile beträgt 255 Byte. Wenn die Zeile abgerufen wurde, wäre der Status 0; wenn es keine Zeilen mehr im Puffer gibt, ist es 1.
HINWEIS
Obwohl die maximale Größe einer Pufferzeile 255 Bytes beträgt, kann die Ausgabevariablenzeile mehr als 255 Zeichen umfassen. Die Pufferzeile kann aus DATE
bestehen Werte zum Beispiel.
Diese nehmen 7 Byte Speicherplatz im Puffer ein, werden aber normalerweise in Zeichenketten mit Längen größer als 7 konvertiert.
GET_LINES
Die GET_LINES-Prozedur hat ein Argument, das eine PL/SQL-Tabelle ist. Der Tabellentyp und die Syntax sind
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Wobei Zeilen eine PL/SQL-Tabelle ist, die mehrere Zeilen aus dem Puffer und numlines
enthält gibt an, wie viele Zeilen angefordert werden. Bei der Eingabe in GET_LINES, numlines
gibt die angeforderte Zeilenanzahl an. Bei der Ausgabe enthält numlines die tatsächliche Anzahl der zurückgegebenen Zeilen, die kleiner oder gleich der angeforderten Anzahl ist. GET_LINES soll mehrere Aufrufe von GET_LINES ersetzen.
Der CHARARR
Typ ist auch in DBMS_OUTPUT
definiert Paket. Wenn Sie also GET_LINES
aufrufen möchten explizit in Ihrem Code müssen Sie eine Variable vom Typ DBMS_OUTPUT
deklarieren . CHARARR
. Zum Beispiel:
Create Table temp_table (char_col varchar2(4000)) / DECLARE /* Demonstrates using PUT_LINE and GET_LINE. */ v_Data DBMS_OUTPUT.CHARARR; v_NumLines NUMBER; BEGIN -- Enable the buffer first. DBMS_OUTPUT.ENABLE(1000000); -- Put some data in the buffer first, so GET_LINES will -- retrieve something. DBMS_OUTPUT.PUT_LINE( 'Line' ); DBMS_OUTPUT.PUT_LINE( 'Line Two' ); DBMS_OUTPUT.PUT_LINE( 'Line Three' ); --Set the maximum number of lines that we want to retrieve. v_NumLines := 3 ; /* Get the contents of the buffer back. Note that v_DATA is declared of type DBMS_OUTPUT. CHARARR, so that it matches the declaration of DBMS_OUTPUT. GET_LINES. */ DBMS_OUTPUT.GET_LINES(v_DATA, v_NumLines); /* Loop through the returned buffer, and insert the contents into tem_table. */ For v_Counter IN 1.. v_NumLines Loop INSERT INTO temp_table ( char_col ) VALUES ( v_Data ( v_Counter )); END LOOP; END; /
AKTIVIEREN und DEAKTIVIEREN
Die Syntax für die Aufrufe ENABLE und DISABLE lautet:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Wobei buffer_size die Anfangsgröße des internen Puffers in Bytes ist. Die Standardgröße beträgt 20.000 Byte, die maximale Größe 1.000.000 Byte.
Später Argumente für PUT
oder PUT_LINE
werden in diesen Puffer gestellt. Sie werden in ihrem internen Format gespeichert und nehmen so viel Platz im Puffer ein, wie es ihre Struktur vorschreibt.
Wenn DISABLE
aufgerufen wird, wird der Inhalt des Puffers von ihrer Struktur bestimmt. Wenn DISABLE
aufgerufen wird, wird der Inhalt des Puffers geleert und nachfolgende Aufrufe von PUT
und PUT_LINE
nicht beeinflussen.
Verwendung von DBMS_OUTPUT
Der DBMS_OUTPUT
Das Paket selbst enthält keinen Mechanismus zum Drucken. Im Wesentlichen implementiert es lediglich eine First-In-First-Out-Datenstruktur.
Wie können wir jedoch DBMS_OUTPUT
verwenden? zum Drucken? SQL*Plus, SQL*DBA und Manager verfügen über eine Option namens SERVEROUTPUT
. Darüber hinaus verfügen einige Produkte von Drittanbietern (einschließlich SQL-Station) über eine Option, die die Anzeige von DBMS_OUTPUT
ermöglicht Daten.
Mit dieser Option ruft SQL*Plus automatisch DBMS_OUTPUT.GET_LINES
auf wenn ein PL/SQL-Block endet und die Ergebnisse, falls vorhanden, auf dem Bildschirm ausgibt.
Der SQL*Plus-Befehl SET SERVEROUTPUT ON
ruft implizit auf, wodurch der interne Puffer eingerichtet wird. Optional können Sie die Größe mit SET SERVEROUTPUT ON SIZE
angeben buffer_size wobei beffer_size wird als Anfangsgröße des Puffers verwendet (das Argument für DBMS_OUTPUT.ENABLE
).
Mit SERVEROUTPUT on
, SQL*Plus ruft DBMS_OUTPUT.GET_LINES
auf nach der PL/SQL-Block ist abgeschlossen. Das bedeutet, dass die Ausgabe auf dem Bildschirm wiedergegeben wird, wenn der Block beendet ist und nicht während der Ausführung des Blocks. Dies ist normalerweise kein Problem, wenn DBMS_OUTPUT
wird zum Debuggen verwendet.
ACHTUNG
DBMS_OUTPUT
wurde entwickelt, um hauptsächlich zum Debuggen verwendet zu werden. Es dient nicht der allgemeinen Berichterstattung. Wenn Sie die Ausgabe Ihrer Abfragen anpassen müssen, ist es besser, Tools wie Oracle Reports als DBMS_OUTPUT
zu verwenden und SQL*Plus.
SET serveroutput on SIZE 1000000 BEGIN DBMS_OUTPUT.PUT_LINE('Before loop'); FOR v_Counter IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('Inside loop, couter = ' || v_Counter); END LOOP; DBMS_OUPUT.PUT_LINE( 'After loop'); END; /
Der interne Puffer hat eine maximale Größe (angegeben in DBMS_OUTPUT.ENABLE
), und jede Zeile hat eine maximale Länge von 255 Byte. Als Ergebnis Aufrufe an DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
und DBMS_OUTPUT.NEW_LINE
kann beide erhöhen
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
Oder
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
Die Meldung hängt davon ab, welches Limit überschritten wird.
Siehe auch:
- Wie aktiviere ich DBMS_OUTPUT in Toad for Oracle?
- DBMS_OUTPUT.Put_Line-Ausgabe in Oracle-Tabelle mit DBMS_OUTPUT.Get_Lines protokollieren