Pergunta

Estamos vendo muitos erros "ORA-00936: Expressão ausente" em nosso log de aplicativos. Existe uma maneira de Oracle para determinar quais afirmações estão falhando?

Eu tentei consultar o V $ SQL, mas essas instruções não são inseridas nessa visão, pois elas não passam nas verificações de sintaxe.

Nosso aplicativo C# está usando o LINQ para gerar uma consulta para um banco de dados Oracle. Isso torna um pouco difícil obter a consulta SQL do aplicativo. Eu esperava poder conseguir o Oracle mais fácil.

Foi útil?

Solução

Você pode criar um gatilho no Oracle que registrará todos os erros (ou praticamente tudo - no_data_found não é considerado um erro). No exemplo abaixo, qualquer erro no esquema é gravado na tabela Track_Detail (erro em uma linha, falhou no SQL no próximo). Você pode torná -lo mais sofisticado com um número de sequência, data/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;
/

Lembre -se de soltar (ou desativar) o gatilho quando terminar.

Outras dicas

Se você puder ativar o rastreamento do SQL do código do aplicativo de alguma forma (Alter Session Set SQL_TRACE = true), as instruções serão exibidas nos arquivos de rastreamento no host do banco de dados.

Você pode tentar usar algo como Wireshark na porta usado para se conectar ao Oracle para ver quais instruções SQL estão sendo enviadas. Pode não ser a melhor resposta-mas pode levá-lo aonde você precisa ir mais rápido.

Experimente a solução de monitoramento SQL de Blog Kris Vandermotten.

Também você pode redirecionar o log com Propriedade DataContext.log :

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

Ou use outras ferramentas de depuração como Visualizador de Linq para entidades ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top