sql >> Base de Datos >  >> RDS >> Oracle

Aprenda sobre el paquete DBMS_OUTPUT en Oracle

En este artículo, examinaremos el DBMS_OUTPUT paquete con cierto detalle. DBMS_OUTPUT El paquete en Oracle, al igual que otros paquetes de DBMS, es propiedad del usuario de Oracle SYS .

El script que crea DBMS_OUTPUT otorga el permiso EXECUTE en el paquete a PUBLIC y crea un sinónimo público para él. Esto significa que cualquier usuario de Oracle puede llamar a las rutinas en DBMS_OUTPUT sin tener que prefijar el nombre del paquete con SYS .

¿Cómo funciona DBMS_OUTPUT en Oracle?

Dos operaciones básicas, GET y PUT , se implementan a través de procedimientos en el paquete. Un PUT La operación toma su argumento y lo coloca en un búfer interno para su almacenamiento.

Un GET operación lee de este búfer y devuelve el contenido como un argumento para el procedimiento. También hay un ENABLE procedimiento que establece el tamaño del búfer.

Procedimientos en el paquete DBMS_OUTPUT

El PUT las rutinas en el paquete son PUT , PUT_LINE y NEW_LINE . El GET las rutinas son GET_LINE y GET_LINES . HABILITAR y DESHABILITAR el control del búfer.

PUT y PUT_LINE La sintaxis de las llamadas PUT y PUT_LINE es:

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

Donde a es el argumento que se colocará en el búfer. Tenga en cuenta que el tipo del parámetro sobrecarga estos procedimientos. Debido a las tres versiones diferentes de PUT y PUT_LINE , el búfer puede contener valores de tipo VARCHAR2 , NUMBER y DATE se almacenan en el búfer en su formato original. Sin embargo, GET_LINE y GET_LINES recuperar del búfer y devolver solo cadenas de caracteres.

Cuando un GET se realiza la operación, el contenido del búfer se convertirá en una cadena de caracteres de acuerdo con las reglas de conversión de tipos de datos predeterminadas. Si desea especificar un formato para la conversión, use un TO_CHAR explícito llama al PUT , en lugar de GET .

El búfer está organizado en líneas, cada una de las cuales puede tener un máximo de 255 bytes. PUT_LINE agrega un carácter de nueva línea después de su argumento, lo que indica el final de una línea. PUT no es. PUT_LINE es equivalente a llamar a PUT y luego llamar a NEW_LINE .

NEW_LINE La sintaxis para la llamada NEW_LINE es:

PROCEDURE NEW_LINE;

NEW_LINE coloca un carácter de nueva línea en el búfer, lo que indica el final de una línea. No hay límite para el número de líneas en el búfer. Sin embargo, el tamaño total del búfer está limitado al valor especificado en HABILITAR.

GET_LINE La sintaxis de GET_LINE es:

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

Donde la línea es una cadena de caracteres que contendrá una línea del búfer y el estado indica si la línea se recuperó correctamente. La longitud máxima de una línea es de 255 bytes. Si se recuperara la línea, el estado sería 0; si no hay más líneas en el búfer, será 1.

NOTA

Aunque el tamaño máximo de una línea de búfer es de 255 bytes, la línea de variable de salida puede tener más de 255 caracteres. La línea de búfer puede consistir en DATE valores, por ejemplo.

Estos ocupan 7 bytes de almacenamiento en el búfer, pero generalmente se convierten en cadenas de caracteres con longitudes superiores a 7.

OBTENER_LINEAS

El procedimiento GET_LINES tiene un argumento que es una tabla PL/SQL. El tipo de tabla y la sintaxis son

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

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

Donde líneas es una tabla PL/SQL contendrá varias líneas del búfer y numlines indica cuántas líneas se solicitan. En la entrada a GET_LINES, numlines especifica el número solicitado de líneas. En Salida, numlines contendrá el número real de líneas devueltas, que será menor o igual que el número solicitado. GET_LINES está diseñado para reemplazar varias llamadas a GET_LINES.

El CHARARR el tipo también se define en el DBMS_OUTPUT paquete. Por lo tanto, si desea llamar a GET_LINES explícitamente en su código, debe declarar una variable de tipo DBMS_OUTPUT . CHARARR . Por ejemplo:

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

ACTIVAR y DESACTIVAR

La sintaxis para las llamadas ENABLE y DISABLE es:

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Donde buffer_size es el tamaño inicial del búfer interno, en bytes. El tamaño predeterminado es de 20 000 bytes y el tamaño máximo es de 1 000 000 de bytes.

Más tarde, argumentos para PUT o PUT_LINE se colocará en este búfer. Se almacenan en su formato interno, ocupando tanto espacio en el búfer como dicta su estructura.

Si DISABLE se llama, los contenidos del búfer son dictados por su estructura. Si DISABLE se llama, el contenido del búfer se purga y las llamadas posteriores a PUT y PUT_LINE no afectan.

Uso de DBMS_OUTPUT

El DBMS_OUTPUT el paquete en sí no contiene ningún mecanismo para imprimir. Esencialmente, implementa simplemente una estructura de datos de tipo primero en entrar, primero en salir.

Habiendo dicho eso, ¿cómo podemos usar DBMS_OUTPUT ¿para imprimir? SQL*Plus, SQL*DBA y Manager tendrán una opción conocida como SERVEROUTPUT . Además, algunos productos de terceros (incluida SQL-Station) tienen una opción que permite mostrar DBMS_OUTPUT datos.

Con esta opción, SQL*Plus llamará automáticamente a DBMS_OUTPUT.GET_LINES cuando concluye un bloque PL/SQL e imprime los resultados, si los hay, en la pantalla.

El comando SQL*Plus SET SERVEROUTPUT ON llama implícitamente, lo que configura el búfer interno. Opcionalmente, puede especificar el tamaño con SET SERVEROUTPUT ON SIZE tamaño_búfer  donde beffer_size  se usará como el tamaño inicial del búfer (el argumento de DBMS_OUTPUT.ENABLE ).

Con SERVEROUTPUT on , SQL*Plus llamará a DBMS_OUTPUT.GET_LINES después  el bloque PL/SQL se ha completado. Esto significa que la salida se repetirá en la pantalla cuando el bloque haya terminado y no  durante la ejecución del bloque. Esto normalmente no es un problema cuando  DBMS_OUTPUT se utiliza para la depuración.

PRECAUCIÓN

DBMS_OUTPUT está diseñado para ser utilizado principalmente para la depuración. No está diseñado para informes generales. Si necesita personalizar el resultado de sus consultas, es mejor usar herramientas como Oracle Reports que DBMS_OUTPUT y 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;
/

El búfer interno tiene un tamaño máximo (especificado en DBMS_OUTPUT.ENABLE ), y cada línea tiene una longitud máxima de 255 bytes. Como resultado, las llamadas a DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE y DBMS_OUTPUT.NEW_LINE puede subir cualquiera

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

O

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

El mensaje depende de qué límite se exceda.

Véase también:

  • ¿Cómo habilitar DBMS_OUTPUT en Toad para Oracle?
  • Registre la salida DBMS_OUTPUT.Put_Line en la tabla en Oracle con DBMS_OUTPUT.Get_Lines