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