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