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