sql >> Database >  >> RDS >> Oracle

Meer informatie over het DBMS_OUTPUT-pakket in Oracle

In dit artikel onderzoeken we de DBMS_OUTPUT pakket in detail. DBMS_OUTPUT pakket in Oracle is, net als andere DBMS-pakketten, eigendom van de Oracle-gebruiker SYS .

Het script dat DBMS_OUTPUT . aanmaakt verleent de EXECUTE-machtiging op het pakket aan het PUBLIEK, en maakt er een openbaar synoniem voor. Dit betekent dat elke Oracle-gebruiker de routines in DBMS_OUTPUT . kan aanroepen zonder de pakketnaam vooraf te hoeven gaan met SYS .

Hoe werkt DBMS_OUTPUT in Oracle?

Twee basishandelingen, GET en PUT , worden geïmplementeerd via procedures in het pakket. Een PUT operatie neemt zijn argument en plaatst het in een interne buffer voor opslag.

Een GET operatie leest uit deze buffer en retourneert de inhoud als een argument voor de procedure. Er is ook een ENABLE procedure die de grootte van de buffer instelt.

Procedures in DBMS_OUTPUT-pakket

De PUT routines in het pakket zijn PUT , PUT_LINE , en NEW_LINE . De GET routines zijn GET_LINE en GET_LINES . ENABLE en DISABLE controle van de buffer.

PUT en PUT_LINE De syntaxis voor de PUT- en PUT_LINE-aanroepen is:

PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);
PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);

Waarbij a het argument is dat in de buffer moet worden geplaatst. Merk op dat het type parameter deze procedures overbelast. Vanwege de drie verschillende versies van PUT en PUT_LINE , de buffer kan waarden van het type VARCHAR2 . bevatten , NUMBER , en DATE worden in hun oorspronkelijke formaat in de buffer opgeslagen. Echter, GET_LINE en GET_LINES ophalen uit de buffer en alleen tekenreeksen retourneren.

Wanneer een GET bewerking wordt uitgevoerd, wordt de inhoud van de buffer geconverteerd naar een tekenreeks volgens de standaardconversieregels voor gegevenstypes. Als je een formaat voor de conversie wilt specificeren, gebruik dan een expliciete TO_CHAR bel op de PUT , in plaats van de GET .

De buffer is georganiseerd in regels, die elk maximaal 255 bytes kunnen hebben. PUT_LINE voegt een teken voor een nieuwe regel toe na het argument, waarmee het einde van een regel wordt aangegeven. PUT doet niet. PUT_LINE is gelijk aan het aanroepen van PUT en dan NEW_LINE . bellen .

NEW_LINE De syntaxis voor de NEW_LINE-aanroep is:

PROCEDURE NEW_LINE;

NEW_LINE plaatst een teken voor een nieuwe regel in de buffer, waarmee het einde van een regel wordt aangegeven. Er is geen limiet aan het aantal regels in de buffer. De totale grootte van de buffer is echter beperkt tot de waarde gespecificeerd in ENABLE.

GET_LINE De syntaxis voor GET_LINE is:

PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);

Waarbij de regel een tekenreeks is die één regel van de buffer zal bevatten, en status geeft aan of de regel met succes is opgehaald. De maximale lengte van een regel is 255 bytes. Als de lijn werd opgehaald, zou de status 0 zijn; als er geen regels meer in de buffer zitten, is dit 1.

OPMERKING

Hoewel de maximale grootte van een bufferregel 255 bytes is, kan de regel met de uitvoervariabele meer dan 255 tekens bevatten. De bufferregel kan bestaan ​​uit DATE waarden bijvoorbeeld.

Deze nemen 7 bytes aan opslagruimte in de buffer in, maar worden meestal geconverteerd naar tekenreeksen met een lengte groter dan 7.

GET_LINES

De GET_LINES-procedure heeft een argument dat een PL/SQL-tabel is. Het tabeltype en de syntaxis zijn

TYPE CHARARR IS TABLE OF VERCHAR2(255)
INDEX BY BINARY_INTEGER;

PROCEDURE GET_LINES(lines OUT CHARARR,
numlines IN OUT INTEGER);

Waar regels is, zal een PL/SQL-tabel meerdere regels uit de buffer bevatten, en numlines geeft aan hoeveel regels er worden aangevraagd. Bij invoer naar GET_LINES, numlines specificeert het gevraagde aantal regels. Bij uitvoer bevatten numlines het werkelijke aantal geretourneerde regels, dat kleiner is dan of gelijk is aan het gevraagde aantal. GET_LINES is ontworpen om meerdere oproepen naar GET_LINES te vervangen.

De CHARARR type wordt ook gedefinieerd in de DBMS_OUTPUT pakket. Daarom, als u GET_LINES . wilt bellen expliciet in uw code, moet u een variabele van het type DBMS_OUTPUT . declareren . CHARARR . Bijvoorbeeld:

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;
/

INSCHAKELEN en UITSCHAKELEN

De syntaxis voor de ENABLE- en DISABLE-aanroepen is:

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Waar buffer_size de initiële grootte is van de interne buffer, in bytes. De standaardgrootte is 20.000 bytes en de maximale grootte is 1.000.000 bytes.

Later, argumenten voor PUT of PUT_LINE wordt in deze buffer geplaatst. Ze worden opgeslagen in hun interne formaat en nemen zoveel ruimte in de buffer in beslag als hun structuur vereist.

Als DISABLE wordt genoemd, wordt de inhoud van de buffer bepaald door hun structuur. Als DISABLE wordt aangeroepen, wordt de inhoud van de buffer gewist en daaropvolgende oproepen naar PUT en PUT_LINE hebben geen invloed.

DBMS_OUTPUT gebruiken

De DBMS_OUTPUT pakket zelf bevat geen mechanisme om af te drukken. In wezen implementeert het slechts een first in, first out datastructuur.

Dat gezegd hebbende, hoe kunnen we DBMS_OUTPUT . gebruiken om te printen? SQL*Plus, SQL*DBA en Manager hebben een optie die bekend staat als SERVEROUTPUT . Bovendien hebben sommige producten van derden (inclusief SQL-station) een optie waarmee DBMS_OUTPUT kan worden weergegeven. gegevens.

Met deze optie roept SQL*Plus automatisch DBMS_OUTPUT.GET_LINES aan wanneer een PL/SQL-blok wordt afgesloten en de eventuele resultaten op het scherm worden afgedrukt.

Het SQL*Plus-commando SET SERVEROUTPUT ON impliciet oproepen, waarmee de interne buffer wordt ingesteld. Optioneel kunt u de grootte specificeren met SET SERVEROUTPUT ON SIZE buffer_size  waar beffer_size  wordt gebruikt als de initiële grootte van de buffer (het argument voor DBMS_OUTPUT.ENABLE ).

Met SERVEROUTPUT on , zal SQL*Plus DBMS_OUTPUT.GET_LINES aanroepen na  het PL/SQL-blok is voltooid. Dit betekent dat de uitvoer naar het scherm wordt herhaald wanneer het blok is voltooid en niet  tijdens de uitvoering van het blok. Dit is meestal geen probleem als  DBMS_OUTPUT wordt gebruikt voor foutopsporing.

LET OP

DBMS_OUTPUT is ontworpen om voornamelijk te worden gebruikt voor debuggen. Het is niet bedoeld voor algemene rapportage. Als u de uitvoer van uw zoekopdrachten moet aanpassen, is het beter om tools zoals Oracle Reports te gebruiken dan DBMS_OUTPUT en 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;
/

De interne buffer heeft wel een maximale grootte (gespecificeerd in DBMS_OUTPUT.ENABLE ), en elke regel heeft een maximale lengte van 255 bytes. Dientengevolge, oproepen naar DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE , en DBMS_OUTPUT.NEW_LINE kan beide verhogen

ORA-20000: ORU-10027: buffer overflow,
           limit of <buf_limit> bytes.

Of

ORA-20000: ORU-10028 line lenth overflow,
           limit of 255 bytes per line.

Het bericht hangt af van welke limiet wordt overschreden.

Zie ook:

  • Hoe DBMS_OUTPUT inschakelen in Toad voor Oracle?
  • Log DBMS_OUTPUT.Put_Line-uitvoer in tabel in Oracle met DBMS_OUTPUT.Get_Lines
  1. Vraag en antwoord uit onze webinarserie Parameter Sniffing

  2. Retourneer rijen in de exacte volgorde waarin ze zijn ingevoegd

  3. Hoe tijd om te zetten naar de tijdzone van het iPhone-apparaat?

  4. Detecteer dubbele items in recursieve CTE