[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 メーリングリストの案内