Oracle
 sql >> Base de données >  >> RDS >> Oracle

En savoir plus sur le package DBMS_OUTPUT dans Oracle

Dans cet article, nous examinerons le DBMS_OUTPUT paquet en détail. DBMS_OUTPUT package dans Oracle, comme les autres packages de SGBD, appartient à l'utilisateur Oracle SYS .

Le script qui crée DBMS_OUTPUT accorde l'autorisation EXECUTE sur le package à PUBLIC et crée un synonyme public pour celui-ci. Cela signifie que tout utilisateur Oracle peut appeler les routines dans DBMS_OUTPUT sans avoir à préfixer le nom du package avec SYS .

Comment fonctionne DBMS_OUTPUT dans Oracle ?

Deux opérations de base, GET et PUT , sont implémentés via des procédures dans le package. Un PUT l'opération prend son argument et le place dans un tampon interne pour le stockage.

Un GET L'opération lit à partir de ce tampon et renvoie le contenu en tant qu'argument de la procédure. Il y a aussi un ENABLE procédure qui définit la taille du tampon.

Procédures dans le package DBMS_OUTPUT

Le PUT les routines du package sont PUT , PUT_LINE , et NEW_LINE . Le GET les routines sont GET_LINE et GET_LINES . ACTIVER et DÉSACTIVER le contrôle du tampon.

PUT et PUT_LINE La syntaxe des appels PUT et PUT_LINE est :

PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);
PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);

Où a est l'argument à placer dans le tampon. Notez que le type du paramètre surcharge ces procédures. En raison des trois versions différentes de PUT et PUT_LINE , le buffer peut contenir des valeurs de types VARCHAR2 , NUMBER , et DATE sont stockés dans la mémoire tampon dans leur format d'origine. Cependant, GET_LINE et GET_LINES récupérer à partir du tampon et renvoyer uniquement les chaînes de caractères.

Lorsqu'un GET opération est effectuée, le contenu du tampon sera converti en une chaîne de caractères selon les règles de conversion de type de données par défaut. Si vous souhaitez spécifier un format pour la conversion, utilisez un TO_CHAR explicite appeler le PUT , plutôt que le GET .

Le tampon est organisé en lignes, dont chacune peut avoir un maximum de 255 octets. PUT_LINE ajoute un caractère de retour à la ligne après son argument, signalant la fin d'une ligne. PUT ne fait pas. PUT_LINE est équivalent à appeler PUT puis en appelant NEW_LINE .

NEW_LINE La syntaxe de l'appel NEW_LINE est :

PROCEDURE NEW_LINE;

NEW_LINE place un caractère de retour à la ligne dans le tampon, signalant la fin d'une ligne. Il n'y a pas de limite au nombre de lignes dans le tampon. Cependant, la taille totale du tampon est limitée à la valeur spécifiée dans ENABLE.

GET_LINE La syntaxe de GET_LINE est :

PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);

Où la ligne est une chaîne de caractères qui contiendra une ligne du tampon, et le statut indique si la ligne a été récupérée avec succès. La longueur maximale d'une ligne est de 255 octets. Si la ligne était récupérée, le statut serait 0 ; s'il n'y a plus de lignes dans le tampon, ce sera 1.

REMARQUE

Bien que la taille maximale d'une ligne de tampon soit de 255 octets, la ligne de la variable de sortie peut comporter plus de 255 caractères. La ligne tampon peut être constituée de DATE valeurs, par exemple.

Ceux-ci occupent 7 octets de stockage dans le tampon, mais sont généralement convertis en chaînes de caractères d'une longueur supérieure à 7.

GET_LINES

La procédure GET_LINES a un argument qui est une table PL/SQL. Le type de table et la syntaxe sont

TYPE CHARARR IS TABLE OF VERCHAR2(255)
INDEX BY BINARY_INTEGER;

PROCEDURE GET_LINES(lines OUT CHARARR,
numlines IN OUT INTEGER);

Où lignes est une table PL/SQL contiendra plusieurs lignes du tampon, et numlines indique le nombre de lignes demandées. En entrée dans GET_LINES, numlines spécifie le nombre de lignes demandé. En sortie, numlines contiendra le nombre réel de lignes renvoyées, qui sera inférieur ou égal au nombre demandé. GET_LINES est conçu pour remplacer plusieurs appels à GET_LINES.

Le CHARARR le type est également défini dans le DBMS_OUTPUT emballer. Par conséquent, si vous souhaitez appeler GET_LINES explicitement dans votre code, vous devez déclarer une variable de type DBMS_OUTPUT . CHARARR . Par exemple :

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;
/

ACTIVER et DÉSACTIVER

La syntaxe des appels ENABLE et DISABLE est :

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Où buffer_size est la taille initiale du tampon interne, en octets. La taille par défaut est de 20 000 octets et la taille maximale est de 1 000 000 octets.

Plus tard, les arguments de PUT ou PUT_LINE sera placé dans ce tampon. Ils sont stockés dans leur format interne, occupant autant d'espace dans la mémoire tampon que leur structure l'exige.

Si DISABLE est appelé, le contenu du tampon est dicté par sa structure. Si DISABLE est appelé, le contenu du tampon est purgé et les appels ultérieurs à PUT et PUT_LINE n'affecte pas.

Utiliser DBMS_OUTPUT

Le DBMS_OUTPUT package lui-même ne contient aucun mécanisme d'impression. Essentiellement, il implémente simplement une structure de données premier entré, premier sorti.

Cela dit, comment pouvons-nous utiliser DBMS_OUTPUT pour l'impression? SQL*Plus, SQL*DBA et Manager ll ont une option appelée SERVEROUTPUT . De plus, certains produits tiers (SQL-Station inclus) ont une option qui permet l'affichage de DBMS_OUTPUT données.

Avec cette option, SQL*Plus appellera automatiquement DBMS_OUTPUT.GET_LINES lorsqu'un bloc PL/SQL se termine et imprime les résultats, le cas échéant, à l'écran.

La commande SQL*Plus SET SERVEROUTPUT ON appelle implicitement, ce qui configure le tampon interne. En option, vous pouvez spécifier la taille avec SET SERVEROUTPUT ON SIZE buffer_size  où beffer_size  sera utilisé comme taille initiale du tampon (l'argument de DBMS_OUTPUT.ENABLE ).

Avec SERVEROUTPUT on , SQL*Plus appellera DBMS_OUTPUT.GET_LINES après  le bloc PL/SQL est terminé. Cela signifie que la sortie sera renvoyée à l'écran lorsque le bloc sera terminé et pas  lors de l'exécution du bloc. Ce n'est généralement pas un problème lorsque  DBMS_OUTPUT est utilisé pour le débogage.

ATTENTION

DBMS_OUTPUT est conçu pour être utilisé principalement pour le débogage. Il n'est pas destiné aux rapports généraux. Si vous avez besoin de personnaliser la sortie de vos requêtes, il est préférable d'utiliser des outils tels qu'Oracle Reports plutôt que DBMS_OUTPUT et 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;
/

Le tampon interne a une taille maximale (spécifiée dans DBMS_OUTPUT.ENABLE ), et chaque ligne a une longueur maximale de 255 octets. En conséquence, les appels à DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE , et DBMS_OUTPUT.NEW_LINE peut augmenter soit

ORA-20000: ORU-10027: buffer overflow,
           limit of <buf_limit> bytes.

Ou

ORA-20000: ORU-10028 line lenth overflow,
           limit of 255 bytes per line.

Le message dépend de la limite dépassée.

Voir aussi :

  • Comment activer DBMS_OUTPUT dans Toad pour Oracle ?
  • Enregistrer la sortie DBMS_OUTPUT.Put_Line dans la table d'Oracle avec DBMS_OUTPUT.Get_Lines