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()これまでのところ、バインドパラメータ値とその型が保存されている場所を見つけることができませんでした。
どこから探したらいいですか?
まだPreparedStatementから生成する必要があります。私は、MySQLとPostgreSQLと他のデータベースに加えてOracleのサポートを追加しているライブラリの1つにこれを必要としています。そこでは、ロギング機能は単にPreparedStatementオブジェクトを引数として受け取ります。 PreparedStatementオブジェクトでtoString()を呼び出すと、MySQLおよびPostgreSQL JDBCドライバで、含まれているバインドパラメータを使用してSQLが返されます.Oracleで同様の機能を実装する必要があります。 –
次に、ライブラリ自体をこのように動作させるように変更することもできますか?それ以外の場合は、Oracleコードのデバッグを開始し、準備された文を中断してください。次に、構造を見て、値を格納するプライベートな場所を探します。 – akarnokd
ORMがそこにあるような臭いがあります... – ATorras