Pregunta

Estamos viendo una gran cantidad de "ORA-00936: falta de expresión" errores en nuestro registro de aplicación. ¿Hay alguna manera en Oracle para determinar qué declaración (s) están fallando?

He intentado consultar v $ sql, pero estas declaraciones no se insertan en ese punto de vista, ya que no pasan las comprobaciones de sintaxis.

Nuestra C # aplicación está utilizando LINQ para generar una consulta a una base de datos Oracle. Esto hace que sea un poco difícil conseguir la consulta SQL de la aplicación. Tenía la esperanza de que sólo podía obtener de Oracle más fácil.

¿Fue útil?

Solución

Se puede crear un disparador en Oracle que va a registrar todos los errores (o casi todos - NO_DATA_FOUND no se considera un error). En el ejemplo siguiente, se registra ningún error en el esquema de la tabla TRACK_DETAIL (error en una fila, no SQL en el siguiente). Puede que sea más sofisticado con un número de secuencia, fecha / hora, etc.

create table track_detail (val varchar2(4000));

create or replace procedure track (p_text IN VARCHAR2) IS
  PRAGMA AUTONOMOUS_TRANSACTION;
begin
  insert into track_detail(val)
  values (p_text);
  commit;
end;
.
/
create or replace TRIGGER log_err after servererror on schema
DECLARE
  v_temp VARCHAR2(2000) := substr(dbms_utility.format_error_stack,1,2000);
  v_num NUMBER;
  v_sql_text ora_name_list_t;
begin
  v_temp := translate(v_temp,'''','"');
  track(v_temp);
  v_num  := ora_sql_txt(v_sql_text);
  v_temp := null;
  BEGIN
    FOR i IN 1..v_num LOOP
      v_temp := v_temp || v_sql_text(i);
    END LOOP;
  EXCEPTION
    WHEN VALUE_ERROR THEN NULL;
  END;
  v_temp := translate(v_temp,''''||chr(0)||chr(10),'"');
  track(v_temp);
end;
/

Recuerde que debe caer (o desactivar) el gatillo cuando haya terminado con él.

Otros consejos

Si se puede habilitar el seguimiento de SQL desde el código de la aplicación de alguna forma (conjunto sesión alter SQL_TRACE = true), las declaraciones se mostrará en los archivos de seguimiento en el host de la base de datos.

Se podría tratar de usar algo como Wireshark en el puerto utilizado para conectarse a Oracle para ver qué sentencias SQL se están enviando. Puede que no sea la mejor respuesta -. pero podría llegar a donde necesitan ir más rápido

Trate de SQL solución de monitoreo de Kris Vandermotten el blog .

También se puede redirigir registro con DataContext propiedad .log :

using (NorthwindDataContext context = new NorthwindDataContext())
{
  context.Log = Console.Out;
}

O utilizar cualquier otra herramienta de depuración como LINQ a Entidades visualizador ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top