Si es posible, debe reemplazar las llamadas a dbms_output.put_line por su propia función.
Este es el código para esta función WRITE_LOG
- si usted quiere tener la posibilidad de elegir entre 2 soluciones de registro:
CREATE OR REPLACE PROCEDURE to_dbg_table(p_log varchar2)
-- table mode:
-- requires
-- CREATE TABLE dbg (u varchar2(200) --- username
-- , d timestamp --- date
-- , l varchar2(4000) --- log
--);
AS
pragma autonomous_transaction;
BEGIN
insert into dbg(u, d, l) values (user, sysdate, p_log);
commit;
END to_dbg_table;
/
o escriba directamente en el servidor de bases de datos que aloja su base de datos
Este utiliza el Oracle directoryTMP_DIR
CREATE OR REPLACE PROCEDURE to_dbg_file(p_fname varchar2, p_log varchar2)
-- file mode:
-- requires
--- CREATE OR REPLACE DIRECTORY TMP_DIR as '/directory/where/oracle/can/write/on/DB_server/';
AS
l_file utl_file.file_type;
BEGIN
l_file := utl_file.fopen('TMP_DIR', p_fname, 'A');
utl_file.put_line(l_file, p_log);
utl_file.fflush(l_file);
utl_file.fclose(l_file);
END to_dbg_file;
/
WRITE_LOG
entonces el procedimiento WRITE_LOG
que puede cambiar entre los 2 usos, o sea t desactivado o evitar la pérdida de rendimiento (g_DEBUG:=FALSE
).
CREATE OR REPLACE PROCEDURE write_log(p_log varchar2) AS
-- g_DEBUG can be set as a package variable defaulted to FALSE
-- then change it when debugging is required
g_DEBUG boolean := true;
-- the log file name can be set with several methods...
g_logfname varchar2(32767) := 'my_output.log';
-- choose between 2 logging solutions:
-- file mode:
g_TYPE varchar2(7):= 'file';
-- table mode:
--g_TYPE varchar2(7):= 'table';
-----------------------------------------------------------------
BEGIN
if g_DEBUG then
if g_TYPE='file' then
to_dbg_file(g_logfname, p_log);
elsif g_TYPE='table' then
to_dbg_table(p_log);
end if;
end if;
END write_log;
/
Y aquí es cómo probar lo anterior:
1) Lanzamiento de este (modo de archivo) de su SQLPLUS:
BEGIN
write_log('this is a test');
for i in 1..100 loop
DBMS_LOCK.sleep(1);
write_log('iter=' || i);
end loop;
write_log('test complete');
END;
/
2) en el servidor de base de datos, abrir una shell y
tail -f -n500 /directory/where/oracle/can/write/on/DB_server/my_output.log
Esperemos que nadie use tablas con nombres de columna como 'u, d, l' ... – Obenland
@Oberland, los nombres de tablas y columnas no importan si el marco que maneja a sus usuarios es correcto. Por cierto, ¿alguna vez has trabajado para un banco con bases de datos de la vieja escuela? Vale más que eso. –
Supongo que quiere decir "peor";) – quetzalcoatl