In questo articolo esamineremo il DBMS_OUTPUT
pacchetto in qualche dettaglio. DBMS_OUTPUT
pacchetto in Oracle, come altri pacchetti DBMS, è di proprietà dell'utente Oracle SYS
.
Lo script che crea DBMS_OUTPUT
concede l'autorizzazione EXECUTE sul pacchetto al PUBLIC e crea un sinonimo pubblico per esso. Ciò significa che qualsiasi utente Oracle può chiamare le routine in DBMS_OUTPUT
senza dover anteporre al nome del pacchetto SYS
.
Come funziona DBMS_OUTPUT in Oracle?
Due operazioni di base, GET
e PUT
, sono implementati attraverso le procedure nel pacchetto. Un PUT
l'operazione prende il suo argomento e lo inserisce in un buffer interno per l'archiviazione.
Un GET
l'operazione legge da questo buffer e restituisce il contenuto come argomento alla procedura. C'è anche un ENABLE
procedura che imposta la dimensione del buffer.
Procedure nel pacchetto DBMS_OUTPUT
Il PUT
le routine nel pacchetto sono PUT
, PUT_LINE
e NEW_LINE
. Il GET
le routine sono GET_LINE
e GET_LINES
. ABILITA e DISATTIVA il controllo del buffer.
PUT e PUT_LINE La sintassi per le chiamate PUT e PUT_LINE è:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Dove a è l'argomento da inserire nel buffer. Si noti che il tipo del parametro sovraccarica queste procedure. A causa delle tre diverse versioni di PUT
e PUT_LINE
, il buffer può contenere valori di tipo VARCHAR2
, NUMBER
e DATE
vengono memorizzati nel buffer nel loro formato originale. Tuttavia, GET_LINE
e GET_LINES
recupera dal buffer e restituisce solo stringhe di caratteri.
Quando un GET
viene eseguita l'operazione, il contenuto del buffer verrà convertito in una stringa di caratteri in base alle regole di conversione del tipo di dati predefinite. Se vuoi specificare un formato per la conversione, usa un esplicito TO_CHAR
chiama il PUT
, anziché GET
.
Il buffer è organizzato in righe, ognuna delle quali può avere un massimo di 255 byte. PUT_LINE
aggiunge un carattere di nuova riga dopo il suo argomento, segnalando la fine di una riga. PUT
non. PUT_LINE
equivale a chiamare PUT
e poi chiamando NEW_LINE
.
NEW_LINE La sintassi per la chiamata NEW_LINE è:
PROCEDURE NEW_LINE;
NEW_LINE
inserisce un carattere di nuova riga nel buffer, segnalando la fine di una riga. Non c'è limite al numero di righe nel buffer. Tuttavia, la dimensione totale del buffer è limitata al valore specificato in ENABLE.
GET_LINE La sintassi per GET_LINE è:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Dove la riga è una stringa di caratteri che conterrà una riga del buffer e lo stato indica se la riga è stata recuperata correttamente. La lunghezza massima di una riga è 255 byte. Se la riga è stata recuperata, lo stato sarebbe 0; se non ci sono più righe nel buffer, sarà 1.
NOTA
Sebbene la dimensione massima di una riga del buffer sia 255 byte, la riga della variabile di output può contenere più di 255 caratteri. La riga del buffer può essere costituita da DATE
valori, per esempio.
Questi occupano 7 byte di memoria nel buffer, ma di solito vengono convertiti in stringhe di caratteri con lunghezze maggiori di 7.
GET_LINES
La procedura GET_LINES ha un argomento che è una tabella PL/SQL. Il tipo di tabella e la sintassi sono
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Dove righe è una tabella PL/SQL conterrà più righe dal buffer e numlines
indica quante righe sono richieste. In input a GET_LINES, numlines
specifica il numero di righe richiesto. In Output, numlines conterrà il numero effettivo di righe restituite, che sarà inferiore o uguale al numero richiesto. GET_LINES è progettato per sostituire più chiamate a GET_LINES.
Il CHARARR
il tipo è definito anche in DBMS_OUTPUT
pacchetto. Pertanto, se vuoi chiamare GET_LINES
esplicitamente nel tuo codice, devi dichiarare una variabile di tipo DBMS_OUTPUT
. CHARARR
. Ad esempio:
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; /
ABILITA e DISATTIVA
La sintassi per le chiamate ENABLE e DISABLE è:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Dove buffer_size è la dimensione iniziale del buffer interno, in byte. La dimensione predefinita è 20.000 byte e la dimensione massima è 1.000.000 byte.
Successivamente, argomenti per PUT
o PUT_LINE
verrà inserito in questo buffer. Sono archiviati nel loro formato interno, occupando tutto lo spazio nel buffer richiesto dalla loro struttura.
Se DISABLE
viene chiamato, il contenuto del buffer è la loro struttura detta. Se DISABLE
viene chiamato, il contenuto del buffer viene eliminato e le successive chiamate a PUT
e PUT_LINE
non pregiudicare.
Utilizzo di DBMS_OUTPUT
Il DBMS_OUTPUT
il pacchetto stesso non contiene alcun meccanismo per la stampa. In sostanza, implementa semplicemente una struttura di dati first in, first out.
Detto questo, come possiamo usare DBMS_OUTPUT
da stampare? SQL*Plus, SQL*DBA e Manager avranno un'opzione nota come SERVEROUTPUT
. Inoltre, alcuni prodotti di terze parti (inclusa SQL-Station) dispongono di un'opzione che consente la visualizzazione di DBMS_OUTPUT
dati.
Con questa opzione, SQL*Plus chiamerà automaticamente DBMS_OUTPUT.GET_LINES
quando un blocco PL/SQL si conclude e stampa i risultati, se presenti, sullo schermo.
Il comando SQL*Plus SET SERVEROUTPUT ON
chiama implicitamente, che imposta il buffer interno. Facoltativamente, puoi specificare la taglia con SET SERVEROUTPUT ON SIZE
dimensione_buffer dove beffer_size verrà utilizzato come dimensione iniziale del buffer (l'argomento di DBMS_OUTPUT.ENABLE
).
Con SERVEROUTPUT on
, SQL*Plus chiamerà DBMS_OUTPUT.GET_LINES
dopo il blocco PL/SQL è stato completato. Ciò significa che l'output verrà riprodotto sullo schermo al termine del blocco e non durante l'esecuzione del blocco. Di solito non è un problema quando DBMS_OUTPUT
viene utilizzato per il debug.
ATTENZIONE
DBMS_OUTPUT
è progettato per essere utilizzato principalmente per il debug. Non è pensato per la rendicontazione generale. Se devi personalizzare l'output delle tue query, è meglio utilizzare strumenti come Oracle Reports piuttosto che DBMS_OUTPUT
e 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; /
Il buffer interno ha una dimensione massima (specificata in DBMS_OUTPUT.ENABLE
), e ogni riga ha una lunghezza massima di 255 byte. Di conseguenza, chiama a DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
e DBMS_OUTPUT.NEW_LINE
può rilanciare entrambi
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
Oppure
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
Il messaggio dipende dal limite superato.
Vedi anche:
- Come abilitare DBMS_OUTPUT in Toad per Oracle?
- Registra l'output di DBMS_OUTPUT.Put_Line nella tabella in Oracle con DBMS_OUTPUT.Get_Lines