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

Jundo Ishikawa [E-MAIL ADDRESS DELETED]
2007年 2月 20日 (火) 14:33:14 JST


JUNDUです。

 いつもお世話になっております。横から失礼いたします。今回の修正の結果、逆に
以前出来ていたスキーマ名.プロシージャ名という指定方法が出来なくなっていると
思います。

 現状の実装では複数スキーマに同名のプロシージャが存在した場合にスキーマを指
定しないと実行できませんが、それすらも出来なくなるのは問題ではないでしょう
か。

 プロシージャの名称については、省略していない表記方法を基本として可能であれ
ばスキーマ名などを省略できるというのは直感的でよいと思うのですが。Oracleを使
う人がやりそうな書き方って以下の4つくらいでしょうか。

 プロシージャ名
 スキーマ名.プロシージャ名
 パッケージ名.プロシージャ名
 スキーマ名.パッケージ名.プロシージャ名

 これらに対応するとしたら、例えばOracle#getProceduresを以下のようにしてみた
らいかがでしょうか。ResultSet#isBeforeFirstのJavadocによるとレコードがない場
合はfalseらしいので、これでいける気がするのですが。

    public ResultSet getProcedures(final DatabaseMetaData databaseMetaData,
            final String procedureName) {
        final String[] names = DatabaseMetaDataUtil.convertIdentifier(
                databaseMetaData, procedureName).split("\\.");
        final int namesLength = names.length;
        try {
            ResultSet rs = null;
            if (namesLength == 1) {
                // まず、自スキーマから探索
                rs = databaseMetaData.getProcedures(null, "", names[0]);
                if (!rs.isBeforeFirst()) {
                    rs.close();
                    // 全スキーマから探索
                    rs = databaseMetaData.getProcedures(null, null, names[0]);
                }
            } else if (namesLength == 2) {
                // 自スキーマのプロシージャを探索
                rs = databaseMetaData.getProcedures(null, names[0], names[1]);
                if (!rs.isBeforeFirst()) {
                    rs.close();
                    // 全スキーマからパッケージを探索
                    // ※この前に、もう一段階、自スキーマのパッケージのみ探索を入れることも考えられるかも
                    rs = databaseMetaData.getProcedures(names[0], null,
                            names[1]);
                }
            } else if (namesLength == 3) {
                rs = databaseMetaData.getProcedures(names[1], names[0],
                        names[2]);
            }
            return rs;
        } catch (final SQLException e) {
            throw new SQLRuntimeException(e);
        }
    }

 この実装で4種類に対応できるはずです。ただ、シノニムには対応できませんでし
た。これでダメな場合は、スキーマ名の省略には対応しないか、メタデータ以外から
の取得(アノテーション?)に方針を変えないと難しい気がします。


-- 
 Jundo Ishikawa <[E-MAIL ADDRESS DELETED]>
        。



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