- PR -

SQLの取得方法

1
投稿者投稿内容
がんこチーム
会議室デビュー日: 2004/09/08
投稿数: 15
投稿日時: 2004-11-22 17:23
現在JDBCを使って開発しているのですが、次の処理が本当に出来ないのか分からないので教えてください。処理内容は、「PreparedStatementインターフェースを使ってSQLとそのパラメータを入れ、それを実行する前にSQLを 「既存のメソッドから取り出し」 ログを書きだす。」というものです。いろいろ調べてみたのですがSQLを取り出すメソッドを自分では発見できませんでした。本当にSQLを取り出すことは出来ないのでしょうか?教えてください。もし用意されているのならそのメソッドを教えてください。
_________________
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2004-11-22 17:54
直接の回答ではありませんが、オラクルだと監査の機能を使えば、実行されたSQLすべて取得できます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-22 18:13
P6spy とかどうでしょう?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6702&forum=12
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2004-11-22 18:44
ども、もしもしと申します。

Oracle であれば、デバッグ用の JDBC ドライバを使えばトレースが取れます。
%ORACLE_HOME%\jdbc\lib\ojdbc14_g.jar を %CLASSPATH% に指定して、

コード:
(略)

  public static void main(String[] args) {
    Test test = new Test();
    DBconnect dbConn = new DBconnect("scott", "tiger", "testsrv", new Integer(1521), "test");
    String strQuery = "select ename from emp where empno = ?";

    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rset = null;

    try {
      con = dbConn.pooledConnection();
      con.setAutoCommit(false);
      pstmt = con.prepareStatement(strQuery);
      pstmt.setInt(1, 7934);
      rset = pstmt.executeQuery();

      while(rset.next()) {
        test.setTestString(rset.getString(1));
      }
    } catch (NullPointerException np) {

(以下略)




とりあえず PreparedStatement を使って値を set して、というソースを
実行するんですが、この時に java 引数に

C\:>java -Doracle.jdbc.LogFile=true -Doracle.jdbc.LogFile=F:\tmp\Test.log Test

こんな感じで引数を指定して実行します。すると、F:\tmp\Test.log の中に

コード:

(略)

DRVR OPER OracleConnection.getAutoCommit() returned true
DRVR OPER OracleResultSetImpl.getString(columnIndex=1)
DRVR OPER OracleConnection.setAutoCommit(autoCommit=true)
DRVR OPER OracleConnection.setAutoCommit(autoCommit): return
DRVR OPER OracleConnection.setAutoCommit(autoCommit=false)
DRVR OPER OracleConnection.setAutoCommit(autoCommit): return
DRVR SQLS SQL: "select ename from emp where empno = ?"
DRVR OPER OracleConnection.getDefaultFixedString() returning false
DRVR OPER ResultSetUtil.needIdentifier(typeCode=1): return: false
DRVR SQLS Input SQL:  "select ename from emp where empno = ?"  <-- SQL
DRVR OPER OraclePreparedStatement.setInt(paramIndex=1, x=7934) <-- setInt() の内容
DRVR OPER OraclePreparedStatement.executeQuery()
DRVR OPER OraclePreparedStatement.executeUpdate()

(略)




こんなトレースがとれます。
がんこチーム
会議室デビュー日: 2004/09/08
投稿数: 15
投稿日時: 2004-12-01 12:14
沢山の返答ありがとうございます。色々検討した結果、納期が近かったこともあり今回はログ出力用のプログラムを自分達で作りました。本当に沢山の返答ありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-01 14:44
うーん、どのように検討されたのでしょうか?
デバッグ用のドライバを使ったり P6Spy を使ったりする方法はかなり簡単で早いと思いますが・・・。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-12-01 20:24
JDBC APIは全てインターフェイス定義しかないので、汎用的なデコレータを書くのは、
そんなに難しくないんですよね。

デコレータでSQL実行の呼び出しをハンドリングしてObserverパターンその他で通知とか、
あちこちでよく書きますよ。
1

スキルアップ/キャリアアップ(JOB@IT)