Question

Nous voyons beaucoup de « ORA-00936: expression manquantes » erreurs dans notre journal d'application. Est-il possible d'Oracle pour déterminer quelle déclaration (s) ne parviennent pas?

J'ai essayé v $ sql interrogation, mais ces déclarations ne sont pas insérés dans ce point de vue, car ils ne passent pas les contrôles de syntaxe.

Notre application C # utilise pour générer une Linq requête à une base de données Oracle. Cela en fait un peu difficile à obtenir la requête SQL de l'application. J'espérais que je pouvais obtenir d'Oracle plus facile.

Était-ce utile?

La solution

Vous pouvez créer un déclencheur dans Oracle qui se connectera toutes les erreurs (ou à peu près tous - NO_DATA_FOUND est pas une erreur). Dans l'exemple ci-dessous, toute erreur dans le schéma est enregistré dans la table de TRACK_DETAIL (erreur dans une rangée, a échoué SQL dans l'autre). Vous pouvez le rendre plus sophistiqué avec un numéro de séquence, date / heure, 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;
/

Rappelez-vous de laisser tomber (ou désactiver) le déclencheur lorsque vous avez terminé avec elle.

Autres conseils

Si vous pouvez activer le traçage SQL à partir du code de l'application d'une certaine manière (alter session de jeu de SQL_TRACE = true), les déclarations apparaîtront dans les fichiers de trace sur l'hôte de base de données.

Vous pouvez essayer d'utiliser quelque chose comme Wireshark sur le port utilisé pour se connecter à Oracle pour voir ce que les instructions SQL sont envoyées. Peut-être pas la meilleure réponse -. Mais il pourrait vous arriver là où vous devez aller plus vite

Essayez la solution de surveillance SQL Kris Vandermotten blog.

Vous pouvez également rediriger journal avec DataContext propriété .log :

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

Ou utiliser d'autres outils de débogage comme LINQ to Entities Visualiseur ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top