Oracle: Est-il possible d'obtenir des erreurs récentes de syntaxe SQL?
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.
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 ...