[Seasar-user:3165] Re: S2Dao からストアドプロシージャの実行

上原 慶三 keizou
2006年 2月 8日 (水) 08:58:56 JST


上原です。

> Oracleのストアドは戻り値がない為、BEANアノテーションは
> 設定しなくとも良いと思っていたのですが、
> 設定しないとエラーになってしました。
> やはり、これはパラメータ受け渡し用のモデルを設定するのでしょうか?
> しかし設定した場合にはテーブル(HogehogeTable)が見つかりません
> とエラーが発生します。
現在のところDaoにBEANアノテーションが必須となっているため
ストアドプロシジャの実行に必要なくても、BEANアノテーションが必要です。

> もしや、OracleのパラメータにはIN、OUT、INOUTと3種類有りますが、
> それに対応した値を渡す場合の記述がおかしいのでしょうか?
> propertyはSPパラメータと同様の名称を使用し、作成しました。
戻り値やOUTパラメータが1つ未満なら、メタデータからデータを取得して
設定しなくてもすむようにしたつもりですが、
まだpostgresqlでしか試していないので、Oracleだと動かないかもしれません。
Oracleも無料で利用できるようになったみたいなので、
今夜あたり試して見ます。

> 
> とりあえず、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;
> /
> 
> 以上、よろしくお願い致します。
 うーん、できればプロシジャ名以外の設定はしたくないので
これだとSpringはあんまり参考にならないですね。
それとも、メタデータからだけだと無理なのか。

-- 
---
上原 慶三<[E-MAIL ADDRESS DELETED]>



Seasar-user メーリングリストの案内