Pregunta

Tengo un número de procedimientos SQL / pl que pueden tardar varios minutos en ejecutarse. Durante el desarrollo de ellos, he añadido unas cuantas declaraciones de impresión para ayudar a depurar y también proporcionan algunos indicadores de retroalimentación y de progreso. Al principio, me encontré con estos en las unidades de prueba pequeños y la salida fue casi instantánea. Ahora que estoy probando con equipos de prueba más grandes que tardan varios minutos para funcionar, me parece que la impresión de que la consola ya no es adecuado, ya que nada se imprime hasta que termine el procedimiento. Estoy acostumbrado a trabajar en entornos que no amortiguan su producción e imprimirlo de inmediato y la adición de impresiones simples declaraciones de depuración simple y de diagnóstico es común.

¿Es posible en PL / SQL para imprimir salida inmediatamente (no amortiguada)? Si no es así, ¿Qué alternativas personas recomiendan para obtener un resultado similar?

¿Fue útil?

Solución

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

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

A continuación, supervisar la tabla de otra sesión de Oracle.

Otros consejos

tenemos un pequeño truco para esto.

puede utilizar DBMS_APPLICATION_INFO.set_client_info ( "aquí algo de información"); la creación de algunas variables y reemplazar la cadena dentro de "".

y seleccione utilizar client_info de la sesión v $ para controlar el progreso.

He estado usando DBMS_PIPE para este propósito. Enviar mensajes a una tubería con nombre y leerlos desde otra sesión. Este método puede no funcionar en un entorno RAC cuando los procesos de lectura y escritura pueden conectarse a un nodo diferente.

También puede insertar mensajes en una tabla utilizando un procedimiento que se ejecuta en su propia sesión utilizando "autonomous_transaction pragma". Puede la consulta estos mensajes desde otra sesión

Edit: Veo que mi segunda opción ya se ha mencionado

.

En general, existen dos opciones:

  • enviar el resultado a una tabla de Oracle (O tabla temporal)
  • Escriba al (host de base de datos) con el sistema de archivos UTL_FILE

Si no tiene acceso al host del sistema operativo de base de datos, todavía puede escribir en el sistema de archivos dbhost y enlazar una tabla Oracle definido externamente al archivo para que pueda ser consultada con un SELECT.

Esto puede depender de su herramienta de cliente. No he utilizado SQL * Plus desde hace tiempo, pero cuando estoy en la depuración de procedimientos PL / SQL Developer, que abrir una ventana de comandos y ejecutar un comando SET SERVEROUTPUT ON. Luego, cuando ejecuto el procedimiento, lo que sea impreso por DBMS_OUTPUT.PUT_LINE muestra enseguida.

Editar: tienes razón, supongo que sólo se estaba viendo que con grandes cantidades de salida o algo así. De todos modos hice un poco de búsqueda en línea y encontré este log4plsql -. Puede ser útil

Una alternativa es utilizar una función que devuelve pipeline su información de registro. Vea aquí un ejemplo: http: //berxblog.blogspot. com / 2009/01 / pipeline-función-vs-dbmsoutput.html Cuando se utiliza una función pipeline usted no tiene que usar otro SQLPLUS / sapo / desarrollador sql, etc ... sesión.

Puede utilizar DBMS Pipe y el Visor de tuberías en PL / SQL Developer para atrapar de forma asíncrona todas las informaciones a medida que se ponen en la tubería.

Tenga cuidado de sólo poner las cosas en una tubería cuando hay alguien que lo lea. De lo contrario, la llamada fallará cuando el tubo está lleno.

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

Otra opción es tener su / SQL PL llamada de un procedimiento para enviar un correo electrónico con el mensaje de registro en el mismo. Esto requiere que la base de datos ha de enviar función de correo electrónico, que se puede añadir usando UTL_SMTP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top