Vamos con otra entrada básica para dummies.
Supongamos que queremos hacer implantar algún tipo de sonda que nos haga una pregunta a la base de datos y nos deje el resultado en un directorio.
Vamos a crear un pequeño procedimiento que, a modo de ejemplo nos saque algunos parámetros del v$session y nos lo deje en un directorio previamente definido llamado SONDA
CREATE OR REPLACE PROCEDURE proc_a_file AS
fichero utl_file.file_type;
nombre_fichero VARCHAR2(255);
linea_resul VARCHAR2(255);
BEGIN
-- Definimos el nombre del log de salida
select 'sonda_'||
to_char(TO_CHAR(sysdate, 'YYYYMMDDHHmiss'))||
'.log'
into nombre_fichero from dual ;
-- Abrimos fichero
fichero := utl_file.fopen('SONDA', nombre_fichero, 'A');
-- Añadimos encabezado
UTL_FILE.PUT_LINE ( fichero ,'SID, SERIAL,TERMINAL,OSUSER');
-- Lanzamos consulta
FOR ciclo IN (
SELECT
select sid SID,
serial# SERIAL,
terminal TEMINAL,
osuser USER
from v$session
)
LOOP --Bucle de scritura de datos
UTL_FILE.PUT_LINE ( fichero ,ciclo.SID||
chr(44)||
ciclo.SERIAL||
chr(44)||
ciclo.TERMINAL||
chr(44)||
ciclo.USER);
END LOOP;
-- Limpiamos y cerramos
utl_file.fflush(fichero);
utl_file.fclose(fichero);
-- Excepciones de error en el alert.log
EXCEPTION
WHEN UTL_FILE.WRITE_ERROR THEN
dbms_system.ksdwrt(2, 'ORA-XXXX Error en procedure proc_a_file escrbiendo en fichero de log.');
WHEN others THEN
dbms_system.ksdwrt(2, 'ORA-XXXX Error genérico en procedure proc_a_file. '||SQLERRM);
END proc_a_file; -- En del procedure
Ahora ya podemos lanzar nuestro procedimiento, bien desde el código de aplicación, cron, task manager, trigger o desde el lugar que deseemos