DBMS_OUTPUT.PUT_LINE vrs UTL_FILE[
Muchos programadores Oracle utilizan el dbms_output.putline para identificar la ejecución de algunos programas realizados en PL. Sobretodo para realizar operaciones de depuración en los cuales después de ejecutado algún trozo de PL. Necesitan analizar mediante mensajes algunos resultados.
Hay quienes ven de similar forma la utilidad que presta el dbms_output.put_line con el comando System.out.println de Java o el FileSystem.PrintLine, de .Net es decir, muestra los parámetros dados en la pantalla en momento de ejecución, desde algún lugar determinado en nuestro código..
Quienes saben de lo que hablo sabrán que dbms_output.put_line es de gran ayuda, pero quienes recién se adentran al fascinante mundo de la programación en PL. y tienen la necesidad de monitorear sus procesos también se darán cuenta que dbms_output.put_line tiene la desventaja de solamente poderse visualizar desde el SQL*Plus o desde cualquier otra herramienta de tipo (TOAD) utilizando el comando set serveroutput on. Pero que hay de aquella necesidad de seguir monitoreando resultados de algunos procesos posteriormente y que no queres guardar en alguna tabla especifica de tu sistema. Pues aquí entra en acción la utilidad que les quiero presentar y que me ha sido de gran ayuda.
UTILIZANDO EL UTIL_FILE Creamos un PROCEDURE que nos facilite el envio de texto a un directorio especifico en el servidor de base de datos.
Antes de crear el procedimiento debemos crear o definir un directorio en nuestra base de datos, en el cual estaremos mandando los resultados de nuestros archivos .log
CREATE OR REPLACE DIRECTORY
MIS_DOCUMENTOS_LOG AS
'SOFTWORKSDISK:[SYSTMP]';
GRANT READ, WRITE ON DIRECTORY SYS.MIS_DOCUMENTOS_LOG TO HBARRERA WITH GRANT OPTION;
Luego creamos el procedimiento
CREATE OR REPLACE PROCEDURE SOFTWORKS.dba_monitor_alertas_log(texto IN VARCHAR2)
IS
filehandler UTL_FILE.file_type;
nameinstance VARCHAR (50);
/******************************************************************************
Exporta automaticamente el contenido de las auditorias utilizando la libreria UTL:FILR
Creado por Chebo.
******************************************************************************/
BEGIN
select 'monitor_acf_'||sys_context('USERENV','DB_NAME')||'_'||to_char(sysdate,'dd_mm_yyyy')||'.log' INTO nameinstance
from dual;
filehandler := UTL_FILE.fopen ('MIS_DOCUMENTOS_LOG', nameinstance, 'a');
UTL_FILE.putf (filehandler,
texto
||'\n'
);
UTL_FILE.fclose (filehandler);
EXCEPTION
WHEN UTL_FILE.invalid_path
THEN
raise_application_error (-20000, 'ERROR: No se pudo registrar el evento en alertas.log.');
END;
/
Un ejemplo de pl utilizando el dbms_output seria asi: set serveroutput on
DECLARE
buffer VARCHAR2(100);
status INTEGER;
BEGIN
dbms_output.put_line('Este es');
dbms_output.put_line('Un Ejemplo.');
dbms_output.get_line(buffer, status);
dbms_output.put_line('Buffer: ' || buffer);
dbms_output.put_line('Status: ' || TO_CHAR(status));
END;
/
En el codigo anterior se obtiene un resultado volatile, al salir de dicha session, esa informacion se pierde.
Ahora veamos como quedaria el ejemplo, manando dichos mensajes a un lugar determinado de nuestro serivor, en concepto de archivo .LOG
set serveroutput on
DECLARE
buffer VARCHAR2(100);
status INTEGER;
BEGIN
dba_monitor_alertas_log('Este es');
dba_monitor_alertas_log(Un Ejemplo.');
dbms_output.get_line(buffer, status);
dba_monitor_alertas_log('Buffer: ' || buffer);
dba_monitor_alertas_log('Status: ' || TO_CHAR(status));
END;
/
Listo! Ya con eso podemos ir generando nuestros archivos .log a conveniencia para posteriormente analizar los resultados. Hasta la proxima entrega amigos.