[Seasar-user:3162] Re: S2Dao からストアドプロシージャの実行
tarumi
yuutarumi
2006年 2月 7日 (火) 21:04:59 JST
tarumiです。
> trunkとはsubversionのメインストリーム
> (っていうんでしょうか、ようするにTagやBranchでないものって
> 説明になってない?)のことです。
> わからなければ、今週末ぐらいにRCを出そうと思うのでそれから
> 確認してみてください。
Maven2の知識がなく、調べていたら遅くなってしまいました。m(_ _)m
と言うか必死でcvsリポジトリを探してましたorz
しかし便利なものがあるんですね^^;
> subverion上にストアドプロシジャをサポートしたものを
> コミットしました。
早速動かしてみましたが、うまく動作させることが出来ませんでした。
Oracleのストアドは戻り値がない為、Beanは設定しなくとも良いと
思っていたのですが、設定しないとエラーになってしました。
これは、パラメータ受け渡し用のモデルを設定するのでしょうか?
設定した場合にはテーブル(HogehogeTable)が見つかりませんって言われます。
またOracleのパラメータにはIN、OUT、INOUTと3種類有りますが、
それに対応した値を渡す場合はどのように記述するべきでしょうか?
SpringではStoredProcedureクラスを継承し、以下のような感じで処理しておりまし
た。
(内部ではJdbcTemplate.call()にて
CallableStatement::executeでSP実行、
CallableStatement::getObjectでOUTパラメータ取得みたいな感じです。)
・コールするインナークラス。
/* テストSP */
protected static class TestSpCall extends StoredProcedure {
public static final String SP_NAME = "TestSp";
/* テストSPの設定 */
public TestSp(DataSource ds) {
// パラメータセット
super(ds, SP_NAME); // ↓IN,OUT,INOUTの型の設定
declareParameter(new SqlParameter("in_user_id", Types.VARCHAR));
declareParameter(new SqlParameter("in_prod_no", Types.NUMERIC));
declareParameter(new SqlOutParameter("out_results",
Types.VARCHAR));
// コンパイル
compile();
}
/* テストSPの実行 */
public void makeTestSp(String user_id, Integer prod_no) throws
DataAccessException {
Map in = new HashMap(); // パラメータセット
in.put("in_user_id", user_id);
in.put("in_prod_no", prod_no);
in.put("out_results", "");
Map out = execute(in); // SP実行
// -1の場合、異常終了
if ("-1".equals(out.get("out_results")))
throw new StoredProcedureFailureException(NAME);
}
}
・ストアド
CREATE OR REPLACE PROCEDURE TestSp(
in_user_id IN VARCHAR2,
in_prod_id IN NUMBER,
out_results OUT VARCHAR2
)
IS
BEGIN
out_results := '1'; -- 実際はINSERTとかUPDATEとか色々更新する
EXCEPTION
WHEN OTHERS THEN
out_results := '-1';
END;
/
以上、よろしくお願い致します。
Seasar-user メーリングリストの案内