Oracle
 sql >> Database >  >> RDS >> Oracle

Ulteriori informazioni sul pacchetto DBMS_OUTPUT in Oracle

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