I denne artikel vil vi undersøge DBMS_OUTPUT
pakke i nogle detaljer. DBMS_OUTPUT
pakke i Oracle, ligesom andre DBMS-pakker, ejes af Oracle-brugeren SYS
.
Scriptet, der opretter DBMS_OUTPUT
giver UDFØR-tilladelsen på pakken til OFFENTLIGheden og opretter et offentligt synonym for det. Det betyder, at enhver Oracle-bruger kan kalde rutinerne i DBMS_OUTPUT
uden at skulle præfikse pakkenavnet med SYS
.
Hvordan fungerer DBMS_OUTPUT i Oracle?
To grundlæggende handlinger, GET
og PUT
, implementeres gennem procedurer i pakken. En PUT
operation tager sit argument og placerer det i en intern buffer til lagring.
En GET
operation læser fra denne buffer og returnerer indholdet som et argument til proceduren. Der er også en ENABLE
procedure, der indstiller størrelsen af bufferen.
Procedurer i DBMS_OUTPUT-pakken
PUT
rutiner i pakken er PUT
, PUT_LINE
og NEW_LINE
. GET
rutiner er GET_LINE
og GET_LINES
. AKTIVER og DEAKTIVER kontrol af bufferen.
PUT og PUT_LINE Syntaksen for PUT- og PUT_LINE-kaldene er:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Hvor a er argumentet, der skal placeres i bufferen. Bemærk, at typen af parameter overbelaster disse procedurer. På grund af de tre forskellige versioner af PUT
og PUT_LINE
, kan bufferen indeholde værdier af typen VARCHAR2
, NUMBER
og DATE
gemmes i bufferen i deres originale format. Dog GET_LINE
og GET_LINES
hent fra bufferen og returner kun tegnstrenge.
Når en GET
handling udføres, vil indholdet af bufferen blive konverteret til en tegnstreng i henhold til standard datatypekonverteringsreglerne. Hvis du ønsker at angive et format for konverteringen, skal du bruge en eksplicit TO_CHAR
kalde på PUT
, i stedet for GET
.
Bufferen er organiseret i linjer, som hver kan have maksimalt 255 bytes. PUT_LINE
tilføjer et nylinjetegn efter dets argument, hvilket signalerer slutningen af en linje. PUT
gør ikke. PUT_LINE
svarer til at kalde PUT
og derefter kalde NEW_LINE
.
NEW_LINE Syntaksen for NEW_LINE-kaldet er:
PROCEDURE NEW_LINE;
NEW_LINE
sætter et nylinjetegn i bufferen, hvilket signalerer slutningen af en linje. Der er ingen grænse for antallet af linjer i bufferen. Den samlede størrelse af bufferen er dog begrænset til den værdi, der er angivet i ENABLE.
GET_LINE Syntaksen for GET_LINE er:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Hvor linjen er en tegnstreng, der vil indeholde én linje af bufferen, og status angiver, om linjen blev hentet med succes. Den maksimale længde af en linje er 255 bytes. Hvis linjen blev hentet, ville status være 0; hvis der ikke er flere linjer i bufferen, vil det være 1.
BEMÆRK
Selvom den maksimale størrelse af en bufferlinje er 255 bytes, kan outputvariabellinjen være på mere end 255 tegn. Bufferlinjen kan bestå af DATE
værdier for eksempel.
Disse optager 7 bytes lagerplads i bufferen, men konverteres normalt til tegnstrenge med længder større end 7.
GET_LINES
GET_LINES-proceduren har et argument, der er en PL/SQL-tabel. Tabeltypen og syntaksen er
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Hvor linjer er en PL/SQL-tabel vil indeholde flere linjer fra bufferen og numlines
angiver, hvor mange linjer der efterspørges. Ved input til GET_LINES, numlines
angiver det ønskede antal linjer. Ved output vil numlines indeholde det faktiske antal returnerede linjer, som vil være mindre end eller lig med det anmodede antal. GET_LINES er designet til at erstatte flere opkald til GET_LINES.
CHARARR
type er også defineret i DBMS_OUTPUT
pakke. Derfor, hvis du vil ringe til GET_LINES
eksplicit i din kode, skal du erklære en variabel af typen DBMS_OUTPUT
. CHARARR
. For eksempel:
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; /
AKTIVER og DEAKTIVER
Syntaksen for ENABLE og DISABLE opkaldene er:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Hvor buffer_size er den indledende størrelse af den interne buffer, i bytes. Standardstørrelsen er 20.000 bytes, og den maksimale størrelse er 1.000.000 bytes.
Senere argumenter til PUT
eller PUT_LINE
vil blive placeret i denne buffer. De er gemt i deres interne format og optager så meget plads i bufferen, som deres struktur tilsiger.
Hvis DISABLE
kaldes, er indholdet af bufferen deres struktur dikterer. Hvis DISABLE
kaldes, renses indholdet af bufferen, og efterfølgende kald til PUT
og PUT_LINE
påvirker ikke.
Brug af DBMS_OUTPUT
DBMS_OUTPUT
pakken i sig selv indeholder ingen mekanisme til udskrivning. Grundlæggende implementerer den blot en først ind, først ud datastruktur.
Når det er sagt, hvordan kan vi bruge DBMS_OUTPUT
til udskrivning? SQL*Plus, SQL*DBA og Manager vil have en indstilling kendt som SERVEROUTPUT
. Derudover har nogle tredjepartsprodukter (SQL-Station inkluderet) en mulighed, der tillader visning af DBMS_OUTPUT
data.
Med denne mulighed vil SQL*Plus automatisk kalde DBMS_OUTPUT.GET_LINES
når en PL/SQL-blok afsluttes og udskriver eventuelle resultater på skærmen.
SQL*Plus-kommandoen SET SERVEROUTPUT ON
implicit opkald, som sætter den interne buffer op. Du kan valgfrit angive størrelse med SET SERVEROUTPUT ON SIZE
bufferstørrelse hvor beffer_size vil blive brugt som startstørrelsen af bufferen (argumentet til DBMS_OUTPUT.ENABLE
).
Med SERVEROUTPUT on
, vil SQL*Plus kalde DBMS_OUTPUT.GET_LINES
efter PL/SQL-blokken er fuldført. Det betyder, at outputtet vil blive ekkoet til skærmen, når blokeringen er færdig og ikke under udførelse af blokken. Dette er normalt ikke et problem, når DBMS_OUTPUT
bruges til fejlretning.
FORSIGTIG
DBMS_OUTPUT
er designet til primært at blive brugt til debugging. Det er ikke beregnet til generel rapportering. Hvis du har brug for at tilpasse outputtet fra dine forespørgsler, er det bedre at bruge værktøjer såsom Oracle Reports end DBMS_OUTPUT
og 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 interne buffer har en maksimal størrelse (specificeret i DBMS_OUTPUT.ENABLE
), og hver linje har en maksimal længde på 255 bytes. Som følge heraf opkald til DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
og DBMS_OUTPUT.NEW_LINE
kan hæve enten
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.
Beskeden afhænger af, hvilken grænse der overskrides.
Se også:
- Hvordan aktiverer du DBMS_OUTPUT i Toad for Oracle?
- Log DBMS_OUTPUT.Put_Line-output i tabel i Oracle med DBMS_OUTPUT.Get_Lines