[Seasar-user:3161] Re: S2Dao からストアドプロシージャの実行
tarumi
yuutarumi
2006年 2月 7日 (火) 20:50:44 JST
tarumiです。
> trunkとはsubversionのメインストリーム
> (っていうんでしょうか、ようするにTagやBranchでないものって
> 説明になってない?)のことです。
> わからなければ、今週末ぐらいにRCを出そうと思うのでそれから
> 確認してみてください。
Maven2の知識がなく、調べていたら遅くなってしまいました。m(_ _)m
と言うか必死でcvsリポジトリを探してましたorz
しかし便利なものがあるんですね^^;
> subverion上にストアドプロシジャをサポートしたものを
> コミットしました。
早速動かしてみましたが、うまく動作させることが出来ませんでした。
Oracleのストアドは戻り値がない為、BEANアノテーションは
設定しなくとも良いと思っていたのですが、
設定しないとエラーになってしました。
やはり、これはパラメータ受け渡し用のモデルを設定するのでしょうか?
しかし設定した場合にはテーブル(HogehogeTable)が見つかりません
とエラーが発生します。
もしや、OracleのパラメータにはIN、OUT、INOUTと3種類有りますが、
それに対応した値を渡す場合の記述がおかしいのでしょうか?
propertyはSPパラメータと同様の名称を使用し、作成しました。
とりあえず、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 メーリングリストの案内