variable valor serveroutput procedimientos imprimir funciones ejemplos developer dbms_output oracle debugging plsql console-output unbuffered-output

valor - Oracle PL/SQL: sugerencias para la impresión de salida/consola inmediata



procedimientos y funciones oracle pl sql (8)

Generalmente hay dos opciones:

  • Enviar la salida a una tabla de Oracle (o tabla temporal)
  • Escribir en el sistema de archivos (base de datos) con UTL_FILE

Si no tiene acceso del sistema operativo al host de la base de datos, aún puede escribir en el sistema de archivos dbhost y vincular una tabla de Oracle definida externamente al archivo para que se pueda consultar con un SELECT.

Tengo una serie de procedimientos pl / sql que pueden tardar varios minutos en ejecutarse. Al desarrollarlos, he añadido algunas declaraciones impresas para ayudar a depurar y también proporcionar algunos comentarios e indicadores de progreso. Inicialmente, los ejecuté en pequeños conjuntos de pruebas y la salida fue casi instantánea. Ahora que estoy probando con conjuntos de pruebas más grandes que tardan varios minutos en ejecutarse, encuentro que la impresión en la consola ya no es adecuada, porque no se imprime nada hasta que finaliza el procedimiento. Estoy acostumbrado a trabajar en entornos que no almacenan en búfer su salida y lo imprimen inmediatamente y es común agregar declaraciones de impresión simples para la depuración simple y el diagnóstico.

¿Es posible en pl / sql imprimir la salida inmediatamente (sin búfer)? De no ser así, ¿qué alternativas recomiendan las personas para obtener un resultado similar?


He estado usando dbms_pipe para este propósito. Envíe mensajes a una tubería con nombre y léalos de otra sesión. Es posible que este método no funcione en un entorno RAC cuando los procesos de escritura y lectura pueden conectarse a un nodo diferente.

Alternativamente, puede insertar mensajes en una tabla usando un procedimiento que se ejecuta en su propia sesión usando "pragma autonom_transaction". Puedes consultar estos mensajes desde otra sesión.

Edit: veo que mi segunda opción ya ha sido mencionada.


Otra opción es que su PL / SQL llame a un procedimiento para enviar un correo electrónico con el mensaje de registro. Esto requiere que su base de datos tenga capacidad de envío de correo electrónico, que se puede agregar usando UTL_SMTP.


Puede depender de su herramienta cliente. No he usado SQL * Plus por un tiempo, pero cuando estoy depurando procedimientos en PL / SQL Developer, abro una ventana de comando y SET SERVEROUTPUT ON comando SET SERVEROUTPUT ON . Luego, cuando ejecuto el procedimiento, cualquier cosa impresa por DBMS_OUTPUT.PUT_LINE aparece de inmediato.

Edit: tienes razón, supongo que solo estaba viendo eso con grandes cantidades de salida o algo así. De todos modos, hice algunas búsquedas en línea y encontré este log4plsql , puede ser útil.


Puede tener un procedimiento que escribe mensajes en una tabla usando una transacción autónoma, algo así como:

procedure log (p_message) is pragma autonomous_transaction; begin insert into message_log (user, datetime, message) values (user, sysdate, p_message); commit; end;

Luego monitorea la tabla desde otra sesión de Oracle.


Puede usar DBMS Pipe y Pipe Viewer en PL / SQL Developer para capturar de forma asíncrona todas las informaciones a medida que se colocan en la tubería.

Tenga cuidado de solo poner las cosas en una tubería cuando haya alguien que lo lea. De lo contrario, su llamada fallará cuando la tubería esté llena.

También existe la posibilidad de usar eventos, PL / SQL Developer también tiene un monitor de eventos. Y los documentos deben proporcionar un ejemplo de cómo hacerlo.


Tenemos un pequeño truco para esto.

puede usar DBMS_APPLICATION_INFO.set_client_info ("alguna información aquí"); creando algunas variables y reemplaza la cadena dentro de "".

y use select client_info de v $ session para monitorear el progreso.