Autor Tema: DBMS_OUTPUT.PUT_LINE vrs UTL_FILE [ORACLE PL/SQL]  (Leído 26260 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado SiKa

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 2548
  • .
DBMS_OUTPUT.PUT_LINE vrs UTL_FILE [ORACLE PL/SQL]
« : diciembre 09, 2009, 02:22:49 pm »
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
 

Código: [Seleccionar]
    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  


Código: [Seleccionar]
    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: 
Código: [Seleccionar]
    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 

 
Código: [Seleccionar]
    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. 
 
[/left]
« Última Modificación: diciembre 09, 2009, 02:30:11 pm por alberto.arevalo »

Desconectado juanca

  • The Communiter-
  • *
  • Mensajes: 1112
Re:DBMS_OUTPUT.PUT_LINE vrs UTL_FILE [ORACLE PL/SQL]
« Respuesta #1 : diciembre 16, 2009, 04:59:35 pm »
Hmmm...el SO es OpenVMS cierto?????
Tus derechos comienzan donde terminan tus responsabilidades......

Desconectado SiKa

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 2548
  • .
Re:DBMS_OUTPUT.PUT_LINE vrs UTL_FILE [ORACLE PL/SQL]
« Respuesta #2 : diciembre 17, 2009, 07:22:08 pm »
Hmmm...el SO es OpenVMS cierto?????

No man... ciertamente las bases que administro estan en OPENVMS pero el codigo que aqui os traje.. es PL/SQL  lo unico que puse de vms es el directorio pero eso facil se cambia por un 'C:\documentos'

Saludos cordiales.

coco

  • Visitante
Re:DBMS_OUTPUT.PUT_LINE vrs UTL_FILE [ORACLE PL/SQL]
« Respuesta #3 : enero 16, 2010, 12:14:40 pm »
hola buenas a tods
tengo problema con mi impresora canon pixma ip1900 el color negro no imprime bien,solo se ve unas manchas negras y aveces ni eso q puedo hacer una ayuda por favor estoy muy preocupado ah
el cartucho esta lleno.
gracias de antemano

Desconectado R99

  • The Communiter-
  • *
  • Mensajes: 3694
  • Yamaha R6 and Yamaha R1 are the great!!!
Re:DBMS_OUTPUT.PUT_LINE vrs UTL_FILE [ORACLE PL/SQL]
« Respuesta #4 : enero 16, 2010, 12:21:38 pm »
hola buenas a tods
tengo problema con mi impresora canon pixma ip1900 el color negro no imprime bien,solo se ve unas manchas negras y aveces ni eso q puedo hacer una ayuda por favor estoy muy preocupado ah
el cartucho esta lleno.
gracias de antemano
Hola amigo Bienvenido, parece que te equivocasteis, haz puesto tu problema en una área a la que no pertenece....Clava tu thread en Soporte a hardware!.
Saludos
Pista Guacima, Costa Rica!   ;)