6
votes

Oracle: Y a-t-il un moyen d'obtenir des erreurs récentes de syntaxe SQL?

Nous voyons beaucoup de "ORA-00936: Erreurs d'expression manquantes" dans notre journal d'application. Existe-t-il un moyen d'ollaxer pour déterminer quels énoncés (s) échouent?

J'ai essayé d'interroger V $ SQL, mais ces déclarations ne sont pas insérées dans cette vue, car elles ne transmettent pas les chèques de syntaxe.

Notre application C # utilise LINQ pour générer une requête sur une base de données Oracle. Cela rend un peu difficile d'obtenir la requête SQL de l'application. J'espérais que je pouvais juste le faire de l'oracle plus facile.


0 commentaires

4 Réponses :


1
votes

Vous pouvez essayer d'utiliser quelque chose comme WireShark sur le port utilisé pour se connecter à Oracle pour voir quelles déclarations SQL sont envoyées. Pourrait ne pas être la meilleure réponse - mais cela pourrait vous obtenir où vous devez aller plus vite.


0 commentaires

2
votes

Si vous pouvez activer le traçage SQL dans le code de l'application (Alter Session Set SQL_TRACE = true), les instructions apparaîtront dans les fichiers de trace de l'hôte de la base de données.


0 commentaires

1
votes

Essayez la solution de surveillance SQL de Kris Vandermotten Blog .

Vous pouvez également rediriger votre journal avec Propriété de DataContext.log : P>

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


1 commentaires

Je n'ai jamais réalisé que la propriété de journal était là. Merci pour ça! Techniquement, nous utilisons une expression LINQ contre un objet-cadre d'entitéContext, pas un DataContext. C'était également sur un serveur si je n'ai pas accès à la modification du code, d'où mon besoin de saisir la requête d'Oracle.



7
votes

Vous pouvez créer un déclencheur dans Oracle qui enregistrera toutes les erreurs (ou à peu près tout - no_data_found n'est pas considérée comme une erreur). Dans l'exemple ci-dessous, toute erreur dans le schéma est enregistrée dans la table pack_detail (erreur d'une ligne, échec SQL dans la suivante). Vous pouvez le rendre plus sophistiqué avec un numéro de séquence, une date / heure, etc. xxx

N'oubliez pas de tomber (ou de désactiver) la gâchette lorsque vous avez fini avec elle.


3 commentaires

+1 J'ai oublié des déclencheurs de niveau de la base de données tout en écrivant ma réponse :(


C'est génial. Je ne savais pas que vous pourriez créer une gâchette sur "ServerError"! Merci!


Accepté cela comme la réponse parce que cela fonctionnait mieux pour ma situation. Je pourrais accéder à une DB en cours d'exécution, créer la gâchette, obtenir l'erreur et supprimer la gâchette sans effectuer des utilisateurs ou redéployer le code de l'application. Merci Gary!