Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erfahren Sie mehr über das DBMS_OUTPUT-Paket in Oracle

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