I den här artikeln kommer vi att undersöka DBMS_OUTPUT
paketera i detalj. DBMS_OUTPUT
paket i Oracle, liksom andra DBMS-paket, ägs av Oracle-användaren SYS
.
Skriptet som skapar DBMS_OUTPUT
ger EXECUTE-tillståndet för paketet till ALLMÄNHETEN och skapar en offentlig synonym för det. Detta innebär att alla Oracle-användare kan anropa rutinerna i DBMS_OUTPUT
utan att behöva prefixa paketnamnet med SYS
.
Hur fungerar DBMS_OUTPUT i Oracle?
Två grundläggande operationer, GET
och PUT
, implementeras genom procedurer i paketet. En PUT
operation tar sitt argument och placerar det i en intern buffert för lagring.
En GET
operation läser från denna buffert och returnerar innehållet som ett argument till proceduren. Det finns också en ENABLE
procedur som anger storleken på bufferten.
Procedurer i DBMS_OUTPUT-paketet
PUT
rutiner i paketet är PUT
, PUT_LINE
och NEW_LINE
. GET
rutiner är GET_LINE
och GET_LINES
. AKTIVERA och AVAKTIVERA kontroll av bufferten.
PUT och PUT_LINE Syntaxen för PUT- och PUT_LINE-anropen är:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Där a är argumentet som ska placeras i bufferten. Observera att typen av parameter överbelastas dessa procedurer. På grund av de tre olika versionerna av PUT
och PUT_LINE
, kan bufferten innehålla värden av typen VARCHAR2
, NUMBER
och DATE
lagras i bufferten i sitt ursprungliga format. Men GET_LINE
och GET_LINES
hämta från bufferten och returnera endast teckensträngar.
När en GET
operationen utförs, kommer innehållet i bufferten att konverteras till en teckensträng enligt standarddatatypkonverteringsreglerna. Om du vill ange ett format för konverteringen, använd en explicit TO_CHAR
anropa PUT
, istället för GET
.
Bufferten är organiserad i rader, som var och en kan ha maximalt 255 byte. PUT_LINE
lägger till ett nyradstecken efter argumentet, vilket signalerar slutet på en rad. PUT
gör inte. PUT_LINE
motsvarar att anropa PUT
och sedan anropa NEW_LINE
.
NEW_LINE Syntaxen för NEW_LINE-anropet är:
PROCEDURE NEW_LINE;
NEW_LINE
lägger ett nyradstecken i bufferten, vilket signalerar slutet på en rad. Det finns ingen gräns för antalet rader i bufferten. Den totala storleken på bufferten är dock begränsad till det värde som anges i ENABLE.
GET_LINE Syntaxen för GET_LINE är:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Där raden är en teckensträng som kommer att innehålla en rad i bufferten, och status indikerar om raden har hämtats framgångsrikt. Den maximala längden på en rad är 255 byte. Om raden hämtades skulle statusen vara 0; om det inte finns fler rader i bufferten blir det 1.
OBS
Även om den maximala storleken på en buffertrad är 255 byte, kan den utgående variabelraden vara mer än 255 tecken. Buffertraden kan bestå av
DATE
värden, till exempel.Dessa tar upp 7 byte lagringsutrymme i bufferten men konverteras vanligtvis till teckensträngar med längder större än 7.
GET_LINES
GET_LINES-proceduren har ett argument som är en PL/SQL-tabell. Tabelltypen och syntaxen är
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Där rader är en PL/SQL-tabell kommer att innehålla flera rader från bufferten och numlines
anger hur många rader som efterfrågas. Vid inmatning till GET_LINES, numlines
anger det begärda antalet rader. Vid utdata kommer numlines att innehålla det faktiska antalet returnerade rader, vilket kommer att vara mindre än eller lika med det antal som begärs. GET_LINES är utformad för att ersätta flera samtal till GET_LINES.
CHARARR
typ definieras också i DBMS_OUTPUT
paket. Därför, om du vill ringa GET_LINES
uttryckligen i din kod måste du deklarera en variabel av typen DBMS_OUTPUT
. CHARARR
. Till exempel:
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; /
AKTIVERA och INAKTIVERA
Syntaxen för ENABLE- och DISABLE-anropen är:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Där buffer_size är initialstorleken på den interna bufferten, i byte. Standardstorleken är 20 000 byte och den maximala storleken är 1 000 000 byte.
Senare, argument till PUT
eller PUT_LINE
kommer att placeras i denna buffert. De lagras i sitt interna format och tar upp så mycket utrymme i bufferten som deras struktur kräver.
Om DISABLE
kallas, innehållet i bufferten är deras struktur dikterar. Om DISABLE
anropas, rensas innehållet i bufferten och efterföljande anrop till PUT
och PUT_LINE
påverkar inte.
Använder DBMS_OUTPUT
DBMS_OUTPUT
paketet i sig innehåller ingen mekanism för utskrift. I huvudsak implementerar den bara en först in, först ut datastruktur.
Med det sagt, hur kan vi använda DBMS_OUTPUT
för utskrift? SQL*Plus, SQL*DBA och Manager kommer att ha ett alternativ som kallas SERVEROUTPUT
. Dessutom har vissa tredjepartsprodukter (SQL-Station ingår) ett alternativ som tillåter visning av DBMS_OUTPUT
data.
Med det här alternativet anropar SQL*Plus automatiskt DBMS_OUTPUT.GET_LINES
när ett PL/SQL-block avslutas och resultaten, om några, skrivs ut på skärmen.
SQL*Plus-kommandot SET SERVEROUTPUT ON
implicit anrop, som ställer in den interna bufferten. Alternativt kan du ange storlek med SET SERVEROUTPUT ON SIZE
buffertstorlek där beffer_size kommer att användas som den initiala storleken på bufferten (argumentet till DBMS_OUTPUT.ENABLE
).
Med SERVEROUTPUT on
, SQL*Plus anropar DBMS_OUTPUT.GET_LINES
efter PL/SQL-blocket har slutförts. Detta innebär att utdata kommer att ekas till skärmen när blockeringen är klar och inte under utförande av blocket. Detta är vanligtvis inte ett problem när DBMS_OUTPUT
används för felsökning.
VARNING
DBMS_OUTPUT
är utformad för att användas främst för felsökning. Den är inte avsedd för allmän rapportering. Om du behöver anpassa utdata från dina frågor är det bättre att använda verktyg som Oracle Reports änDBMS_OUTPUT
och 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; /
Den interna bufferten har en maximal storlek (anges i DBMS_OUTPUT.ENABLE
), och varje rad har en maximal längd på 255 byte. Som ett resultat anrop till DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
och DBMS_OUTPUT.NEW_LINE
kan höja antingen
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
Eller
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
Meddelandet beror på vilken gräns som överskrids.
Se även:
- Hur aktiverar man DBMS_OUTPUT i Toad for Oracle?
- Logga DBMS_OUTPUT.Put_Line-utdata i tabell i Oracle med DBMS_OUTPUT.Get_Lines