2009-07-15 10 views
9

Oracle JDBCの使用時に、実際にバインドされたすべての文のロギングを実装したいとします。そして、私はそのようなロギングメソッドを作成することができ、PreparedStatementオブジェクトをパラメータとして渡すことを好むでしょう。Oracle JDBC PreparedStatementオブジェクトからバインド・パラメータの値を取得する方法

例えば、私はPreparedStatementを作成しているし、私ができることを今私は「employe_id = 1従業員SELECT * FROM」PSから実際のSQL文を取得できるようにしたいと思います一つのパラメータ

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

を結合しましたログファイルを作成します。

は、これまでのところ、私は今、私は私が交換することができるようにPSから現在のバインド変数のリストを取得するための、いくつかの方法が必要です

SELECT * FROM employees WHERE employe_id = ? 

を取得するために

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

を使用できることがわかりましたか?バインドパラメータ値を使用します。私は)ps.getClass(に見てみました

。getDeclaredFields()とps.getClass()。getSuperclass()。getDeclaredFields()これまでのところ、バインドパラメータ値とその型が保存されている場所を見つけることができませんでした。

どこから探したらいいですか?

答えて

2

ほとんどのロギングフレームワークはNested Diagnostic Contextという概念を持っています。準備されたステートメントを記入すると、クエリとそのパラメータをそこに保存することができます。

または、おそらく、1つのステップでそれを行う:

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

まだPreparedStatementから生成する必要があります。私は、MySQLとPostgreSQLと他のデータベースに加えてOracleのサポートを追加しているライブラリの1つにこれを必要としています。そこでは、ロギング機能は単にPreparedStatementオブジェクトを引数として受け取ります。 PreparedStatementオブジェクトでtoString()を呼び出すと、MySQLおよびPostgreSQL JDBCドライバで、含まれているバインドパラメータを使用してSQLが返されます.Oracleで同様の機能を実装する必要があります。 –

+0

次に、ライブラリ自体をこのように動作させるように変更することもできますか?それ以外の場合は、Oracleコードのデバッグを開始し、準備された文を中断してください。次に、構造を見て、値を格納するプライベートな場所を探します。 – akarnokd

+0

ORMがそこにあるような臭いがあります... – ATorras

1

あなたはp6spyで見ることができ、それはモニタリングとロギングを可能にするデータベース・ドライバーへのプロキシです。

+0

以前の回答にコメントしたので、既存の1つのライブラリにOracleサポートを実装したいので、このロギングをプログラムで行い、追加のツールを使用する必要はありません。 –

+0

PreparedStatementだけではできません。 javadocs APIに表示されていない場合は、実行できません。 – duffymo

関連する問題