procedimientos - procedimiento almacenado oracle select
PL/SQL Logging-¿Cómo controlar? (4)
Estoy buscando introducir un marco de registro en nuestra aplicación Oracle existente para reemplazar el uso de DBMS_OUTPUT.
El marco se utilizará principalmente para ayudar a la depuración y detallará cosas como el inicio del procedimiento x, los detalles de los parámetros, el procedimiento final x etc. De hecho, es lo que es prácticamente una funcionalidad de registro estándar.
La implementación de estos requisitos debe ser relativamente sencilla, sin embargo, donde me gustaría que me ayuden es la mejor manera de activar y desactivar esta funcionalidad. Lo que estoy tratando de lograr es el menor impacto de rendimiento posible cuando se desactiva la traza. Que espero que sea la mayor parte del tiempo!
Como la aplicación utiliza 10g versión 2, inicialmente me gustó la apariencia de envolver el mecanismo de registro dentro de la compilación condicional, de modo que el marco de registro no sea visible durante el funcionamiento normal. Desafortunadamente, tuve que abandonar a regañadientes esta idea, ya que la mayoría de las aplicaciones se crean utilizando procedimientos y funciones independientes, por lo que activar una función de registro podría invalidar una gran cantidad de código.
He tenido un vistazo a varios OpenSource y otras funcionalidades de frameworks para inspirarme:
log4plsql ( http://log4plsql.sourceforge.net/ )
La revisión de APC here especialmente bajo un impacto aceptable, me preocupa.
Proyecto OraLog ( http://oralog.sourceforge.net )
No hay actualizaciones desde 2007
PL / VISION ( here )
Parece bastante viejo, no hay cambios desde Oracle 8i?
Pregunte a Tom Instrumentation ( here )
Actualización 01/04/2014 Tom Kyte ahora recomienda el registrador de Tyler Muth
Me interesaría mucho escuchar sus experiencias si ha introducido alguna forma de inicio de sesión en su aplicación Oracle, cómo la implementó y, especialmente, cómo la controla.
¿No sería más fácil configurar un contexto y agregarle un par de valores de nombre? Puede cambiar el valor en el contexto usando un disparador en su tabla de depuración.
En nuestra aplicación, hacemos un uso intensivo de la instrumentación debug.f de Ask Tom. Una cosa que noté rápidamente fue que ''debugtab'' estaba siendo demasiado consultado para ver si el registro estaba activado o no para cada mensaje de registro único. Introduje un cambio para verificar la tabla solo una vez cada 100 mensajes de registro y ahora funciona bastante bien.
Mi punto es tratar de evitar la comprobación de una tabla para cada mensaje de registro para ver si se debe generar o no. A menudo desea activar el inicio de sesión en medio de un largo proceso de ejecución, por lo que es importante que pueda hacerlo. En mi caso, decidí que podría vivir esperando unos segundos hasta que pasaran 100 llamadas de registro antes de que realmente notara que el registro estaba activado.
Mencionó descartar la idea de compilación condicional debido a posibles invalidaciones en cascada: existe un enfoque similar si está dispuesto a tocar la fuente PL / SQL donde se necesita el registro / rastreo que no implique una recompilación para habilitar.
Aún puede agregar un par de nombre / valor de su propia elección a PLSQL_CCFLAGS y hacer que el código de su aplicación realice una consulta relativamente ligera del parámetro v $ para determinar si el registro está "activado". La implementación más cruda sería un par de nombre / valor, pero se podría extender para tener diferentes pares que serían específicos del módulo para que el registro se pueda activar con una granularidad más fina.
[Editar] Este es un ejemplo muy simple en respuesta a su comentario / solicitud: obviamente querrá ser más sofisticado en el análisis de la cadena PLSQL_CCFLAGS en caso de que tenga otra información existente, tal vez incluida en una función, etc .:
create or replace procedure ianc_cc
is
cc_flag_val varchar2(4000);
begin
-- need direct select grant on v_$parameter for this...
select value into cc_flag_val
from v$parameter where name = ''plsql_ccflags'';
if (cc_flag_val = ''custom_logging:true'') then
dbms_output.put_line(''custom logging is on'');
else
dbms_output.put_line(''custom logging is off'');
end if;
end;
/
Ahora, como usuario privilegiado para emitir ALTER SYSTEM:
ALTER SYSTEM set PLSQL_CCFLAGS = ''custom_logging: true'';
y cambiar de nuevo por:
ALTER SYSTEM set PLSQL_CCFLAGS = '''';
Revisando el mismo problema, y encontré el siguiente proyecto que parece estar todavía activo, github.com/tmuth/Logger---A-PL-SQL-Logging-Utility