2009-07-15 8 views
9

Je souhaite implémenter la consignation de toutes les instructions exécutées avec des paramètres de liaison réels lors de l'utilisation de Oracle JDBC. Et je préférerais que je puisse créer une telle méthode de journalisation en passant l'objet PreparedStatement en paramètre.Comment obtenir les valeurs des paramètres de liaison à partir de l'objet Oracle JDBC PreparedStatement

Par exemple, j'ai créé PreparedStatement et ont lié un paramètre

PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM employees WHERE employee_id = ?"); 
ps.setInt(1,1); 

Maintenant, je voudrais être en mesure d'obtenir de ps l'instruction SQL réelle « SELECT * FROM employés OÙ employe_id = 1 » que je pouvais mettre dans le fichier journal.

Jusqu'à présent, je trouve que je peux utiliser

((oracle.jdbc.driver.OracleStatement) ps).getOriginalSql() 

pour obtenir

SELECT * FROM employees WHERE employe_id = ? 

Maintenant, je besoin d'un moyen d'obtenir la liste des variables de liaison en cours de ps pour que je puisse remplacer? avec des valeurs de paramètre de liaison.

J'ai essayé de regarder dans ps.getClass(). GetDeclaredFields() et ps.getClass(). GetSuperclass(). GetDeclaredFields() mais jusqu'à présent n'a pas pu trouver l'endroit où les valeurs des paramètres de liaison et leurs types sont stockés .

Des suggestions où les chercher?

Répondre

2

La plupart des cadres de journalisation ont la notion pour Nested Diagnostic Context. Vous pouvez enregistrer votre requête et ses paramètres lorsque vous remplissez l'instruction préparée.

Ou, peut-être, le faire en une seule étape:

PreparedStatement fillAndLog(Connection conn, String query, Object... args) { 
    int i = 0; 
    PreparedStatement pstmt = conn.prepareStatement(query); 
    for (Object o : args) { 
     if (o instanceof String) { 
      pstmt.setString(i, (String)o); 
     } // else... 
     i++; 
    } 
    log.debug(String.format(query.replaceAll("\\?", "%s"), args)); 
    return pstmt; 
} 
+0

Je dois encore le générer à partir de PreparedStatement. J'ai besoin de ceci pour une bibliothèque où j'ajoute le support d'Oracle en plus de MySQL et de PostgreSQL et d'autres bases de données et là la fonction de notation accepte juste l'objet PreparedStatement comme argument. Dans les pilotes JDBC MySQL et PostgreSQL, si vous appelez toString() sur l'objet PreparedStatement, il renvoie SQL avec les paramètres de liaison inclus. J'ai besoin d'implémenter des fonctionnalités similaires pour Oracle. –

+0

Alors peut-être changer la bibliothèque elle-même pour fonctionner de cette façon aussi? Autre que cela, commencez à déboguer votre code oracle et rompez sur l'instruction préparée. Ensuite, regardez la structure et localisez l'endroit privé où elle stocke les valeurs. – akarnokd

+0

Ce problème ressemble à un ORM. – ATorras

1

Vous pouvez jeter un oeil à p6spy, il est un proxy à votre pilote de base de données qui permet la surveillance et l'exploitation forestière.

+0

Comme je l'ai commenté sur la réponse précédente, je veux implémenter le support d'Oracle dans une bibliothèque existante et par conséquent besoin de faire cette consignation par programmation et ne pas utiliser l'outil supplémentaire. –

+0

Cela ne peut pas être fait avec PreparedStatement. Si vous ne le voyez pas dans l'API javadocs, vous ne pouvez pas le faire. – duffymo

Questions connexes