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