[Seasar-user:6082] [S2Dao]パッケージ化したストアドプロシジャの呼び出し方法について

高谷優子 [E-MAIL ADDRESS DELETED]
2007年 2月 8日 (木) 22:38:40 JST


高谷と申します。

パッケージ化したプロシジャを呼び出すメソッドにつける
PROCEDUREアノテーションについて、設定の仕方が
分からないので教えて下さい。

現在、Oracle9i、s2dao-1.0.40で、
次のようなプロシジャを実行しようとしています。

カタログ名:db
スキーマ名:user
プロシジャ名:pk1.proc


S2Daoのサイトには、次のように説明がありました。
http://s2dao.seasar.org/ja/s2dao.html#ProcedureAnnotation

> バージョン1.0.31より、PROCEDUREアノテーションを使用することにより
StoredProcedureやStoredFunctionを実行することができます。PROCEDUREアノテーション
は以下の形式のうちいずれかを指定します。
> 
> - public static final String メソッド名_PROCEDURE = "カタログ名.スキーマ名.プ
ロシジャ名";
> - public static final String メソッド名_PROCEDURE = "スキーマ名.プロシジャ名";
> - public static final String メソッド名_PROCEDURE = "プロシジャ名";

この説明の通りに、アノテーションをつけると下記のようになると思いますが、
すべてAbstractBasicProcedureHandler#getProcedureMetaDataで、
メタデータの取得ができずに、下記のようなエラーになります。

1.メソッド名_PROCEDURE = "db.user.pk1.proc";
--java.lang.NullPointerException

2.メソッド名_PROCEDURE = "user.pk1.proc";
3.メソッド名_PROCEDURE = "pk1.proc";
--org.seasar.dao.MethodSetupFailureRuntimeException:
[EDAO0019]jp.co.isid.rtgs.dao.RKSetlEntityDaoのexecInsUpdDltSetlメソッドの初期化
時に例外が発生しました。理由はorg.seasar.framework.exception.SRuntimeException:
[EDAO0012]Storedprocedure(db.user.pk1.proc) not found

AbstractBasicProcedureHandler#getProcedureMetaDataのソースを見ると、
単に"."でアノテーションに指定された値を区切り、
前方からカタログ名、スキーマ名と判断をしているようですが、
パッケージ化されたプロシジャには対応しているのでしょうか?
対応している場合、どのように記述すれば良いのでしょうか?

AbstractBasicProcedureHandler#getProcedureMetaData
-------------------------------------------
ProcedureMetaData getProcedureMetaData(DataSource dataSource,
        String procedureName) {
    final Connection con = DataSourceUtil.getConnection(dataSource);
    ResultSet rs = null;
    try {
        DatabaseMetaData dmd = ConnectionUtil.getMetaData(con);
        String[] names = DatabaseMetaDataUtil.convertIdentifier(dmd,
                procedureName).split("\\.");
        final int namesLength = names.length;
        if (namesLength == 1) {
            rs = dmd.getProcedures(null, null, names[0]);
        } else if (namesLength == 2) {
            rs = dmd.getProcedures(null, names[0], names[1]);
        } else if (namesLength == 3) {
            rs = dmd.getProcedures(names[0], names[1], names[2]);
        }
        int len = 0;
        ProcedureMetaData procedureMetaData = new ProcedureMetaData();
        while (rs.next()) {
            procedureMetaData.setProcedureCat(rs.getString(1));
            procedureMetaData.setProcedureSchem(rs.getString(2));
            procedureMetaData.setProcedureName(rs.getString(3));
            procedureMetaData.setProcedureType(rs.getShort(8));
            len++;
        }
        if (len < 1) {
            throw new SRuntimeException("EDAO0012",
                    new Object[] { procedureName });
        }
        if (len > 1) {
            throw new SRuntimeException("EDAO0013",
                    new Object[] { procedureName });
        }
-------------------------------------------


ちなみに、メソッド名_PROCEDURE = "proc";とした場合のみ、
メタデータが取得できますが(値も確認しましたが正しいデータです。)、
プロシジャコマンド実行時にエラーになります。

ProcedureHandlerImpl#execute
-------------------------------------------
protected Object execute(Connection connection, Object[] args) {
    CallableStatement cs = null;
    try {
        cs = prepareCallableStatement(connection);
        bindArgs(cs, args);  
        if (cs.execute()) {/*----- ←ここで落ちる -----*/
            return handleResultSet(cs);
        } else {
            return handleNoResultSet(cs);
        }
    } catch (SQLException e) {
        throw new SQLRuntimeException(e);
    } finally {
        StatementUtil.close(cs);
    }
}
-------------------------------------------
org.seasar.framework.exception.SQLRuntimeException: [ESSR0071]SQLで例外
(ErrorCode=6550, SQLState=65000)が発生しました。理由はjava.sql.SQLException:
ORA-06550: 行1、列7:
PLS-00201: 識別子PROCを宣言してください。
ORA-06550: 行1、列7:
PL/SQL: Statement ignored

デバッグをして、csの値を確認しましたが、
実行時のステートメントと思われる値は、"{call proc()}"となっていました。
(sql-PLUSで、"call pk1.proc()"では実行できる事は確認済みです。

また、次の過去ログ([Seasar-user:5491] [s2Dao]PROCEDURE アノテーションの記述につ
いて)も拝見しましたが、
私の環境では、書かれている通りに動作せずに上記のようになるので、
上手くいきませんでした。

お忙しい中申し訳ありませんが、
どなたかご存知の方がいたらご教示下さい。

宜しくお願い致します。


高谷


----
[E-MAIL ADDRESS DELETED]




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