2011年8月25日木曜日

Call Stored Procedure② (OracleADF)

IN引数のみのストアド・プロシージャ呼出をする為には?

JDBC PreparedStatementオブジェクトを使用する。通常、以下の手順のヘルパーメソッドを用意し、呼出部分の簡素化を実施する。
  1. 渡される文のためのJDBC PreparedStatementを作成し、PL/SQLのbegin...endブロック内にラップする。
  2.  バインド変数が渡された場合は、値のループ処理を実施する。
  3. 各バインド変数の値を文に設定する。(JDBCのバインド変数APIは1から始まる番号付けを使用するため、0から始まるforループのインデックス変数にコードで1を加えていることに注意する。)
  4. 文を実行する。
  5. 文をクローズする。
【Helper】
protected void callStoredProcedure(String stmt, Object[] bindVars) {
  PreparedStatement st = null;
  try {
    // 1. JDBC PreparedStatement を生成
    st = getDBTransaction().createPreparedStatement("begin "+stmt+";end;",0);
    if (bindVars != null) {
      // 2. バインド変数が渡された場合は、値を取得する。
      for (int z = 0; z < bindVars.length; z++) {
        // 3. PreparedStatementにパラメータをセットする。
        st.setObject(z + 1, bindVars[z]);
      }
    }
    // 4. ステートメントを実行。
    st.executeUpdate();
  }
  catch (SQLException e) {
    throw new JboException(e);
  }
  finally {
    if (st != null) {
      try {
        // 5. ステートメントをクローズ。
        st.close();
      }
      catch (SQLException e) {}
    }
  }
}


【Call】
// In StoredProcTestModuleImpl.java
public void callProcWithThreeArgs(Number n, Date d, String v) {
  callStoredProcedure("dev_sample.proc_with_three_args(?,?,?)", new Object[]{n,d,v});
}

0 件のコメント:

コメントを投稿