[seasar-dotnet:1087] Re: S2Dao.NET、DBFlute - Oracleのパッケージ対応について

k.moriwaki [E-MAIL ADDRESS DELETED]
2008年 10月 23日 (木) 22:36:53 JST


森脇です

> 既に別パッケージ同名プロシージャ名があって
> お困りでしょうか???
いえ、そういう訳ではないです。
ただDBFluteを使用するにあたってのポイントみたいな感じで
確認しておきたかっただけです。

今回も迅速な対応ありがとうございました。
久保さんの対応の早さには毎回関心させられます。

また質問するかもしれませんが、よろしくお願いします。


2008/10/23 22:24 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。
>
> 既に別パッケージ同名プロシージャ名があって
> お困りでしょうか???
>
> 2008/10/23 kubo <[E-MAIL ADDRESS DELETED]>:
>> 久保(jflute)です。
>>
>>> dbflute-noracle-exampleをみた感じでは「プロシージャ名=クラス名」に
>>> なっているように見受けられるので同名のクラスになるのでしょうか?
>>
>> はい、そうです。
>> 同名のプロシージャはダメです。
>>
>> 頑張れば対応できなくはないと思いますが、
>> カタログ名の解決など複雑になってしまうのと、
>> パッケージが別とはいえ同じプロシージャ名は
>> 設計的に紛らわしくあまり良いことではないので、
>> 特にサポートする必要はないかなと考えております。
>> (別スキーマ同名テーブルも同様です)
>>
>> 2008/10/23 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>> 森脇です
>>>
>>>> 結論から言うと、実行できました。
>>> おお、素晴らしいです。
>>>
>>>> ProcedurePmbのProcedureNameにパッケージ名を
>>>> 付与することで実行ができるようになったということになります。
>>> 一つ気になった点があるのですが、以下の例みたいに別パッケージに
>>> 同名のプロシージャがある場合はどのようにクラスができるのでしょう?
>>>
>>> package AAA
>>>  procedure CODE;
>>>  procedure NAME;
>>>
>>> package BBB
>>>  procedure CODE;
>>>  procedure NAME;
>>>
>>> dbflute-noracle-exampleをみた感じでは「プロシージャ名=クラス名」に
>>> なっているように見受けられるので同名のクラスになるのでしょうか?
>>>
>>>
>>> 2008/10/23 20:38 kubo <[E-MAIL ADDRESS DELETED]>:
>>>> 久保(jflute)です。
>>>>
>>>> 簡単ではありますが、パッケージ付きプロシージャを作って、
>>>> dbflute-oracle-example並びにdbflute-noracle-exampleで試しました。
>>>> 結論から言うと、実行できました。
>>>>
>>>> 引数もINとOUTとINOUT3つ存在するプロシージャを作って、
>>>> OUTで値を受け取りれることも確認しています。
>>>>
>>>> ということで、以前のDBFluteから比べると
>>>> ProcedurePmbのProcedureNameにパッケージ名を
>>>> 付与することで実行ができるようになったということになります。
>>>>
>>>> ということで、
>>>>
>>>> dbflute-noracle-exampleで確認しているプロシージャを
>>>> そちらの環境で一時的に作成して試して頂けないでしょうか?
>>>> 結果次第で大分切り分けができるかと思います。
>>>> 来週ご確認お願いします。
>>>>
>>>> #
>>>> # とりあえず、Exampleで想定どおりできているので、
>>>> # 予定通り今週リリースします。
>>>> # 来週新たな事象が見つければその次のバージョンで
>>>> # 対応するようにします。
>>>> #
>>>>
>>>> 2008/10/23 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>> 久保(jflute)です。
>>>>>
>>>>>> ちなみにPmbは作られていました。
>>>>>> 以下のようなパッケージ構成だった場合、CodePmbが作成され
>>>>>> returnのフィールドが3つ作成されるといった具合になってました。
>>>>>
>>>>> ありがとうございます。この情報がとてもありがたいです。
>>>>> そして、こちらでもほぼリアルタイムで試してて、
>>>>> 同一スキーマのパッケージのプロシージャであれば、
>>>>> メタ情報が取得できました。
>>>>> 同じところまで再現できれば検証はできるので、
>>>>> 確認してみますね。
>>>>> (同じエラーであれば、やはりADO.NETの使い方だし、
>>>>>  正常に動作できればPL/SQLの文法かもだし)
>>>>>
>>>>> # 途中経過は随時メール出します。
>>>>>
>>>>> 2008/10/23 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>>> 森脇です
>>>>>>
>>>>>>> 該当のPL/SQLは、SQL*Plus等から実行可能ですか?
>>>>>> すいません、これは試していませんでした。
>>>>>> 明日…と言いたいところですが試せるのは月曜以降になりそうです。
>>>>>>
>>>>>>> また、手動で作成したPmbのパラメータの定義(数とか)は
>>>>>>> 合っていますでしょうか?
>>>>>> dbflute-noracle-exampleを参考にして、自動生成されたソースを修正したので
>>>>>> 合っているとおもいます。
>>>>>>
>>>>>>
>>>>>> 以下余談です。
>>>>>>
>>>>>> ちなみにPmbは作られていました。
>>>>>> 以下のようなパッケージ構成だった場合、CodePmbが作成され
>>>>>> returnのフィールドが3つ作成されるといった具合になってました。
>>>>>>
>>>>>> package Pref
>>>>>>   function Code
>>>>>>   function Name
>>>>>>
>>>>>> package City
>>>>>>   function Code
>>>>>>   function Name
>>>>>>
>>>>>> package Town
>>>>>>   function Code
>>>>>>   function Name
>>>>>>
>>>>>> ----- BsCodePmb.cs -----
>>>>>> (略)
>>>>>>        // ===============================================================================
>>>>>>        //
>>>>>>         Definition
>>>>>>        //
>>>>>>         ==========
>>>>>>        // -------------------------------------------------
>>>>>>        //                               Procedure Parameter
>>>>>>        //                               -------------------
>>>>>>         public static readonly String arg1_PROCEDURE_PARAMETER =
>>>>>> "arg1, return";
>>>>>>         public static readonly String arg2_PROCEDURE_PARAMETER =
>>>>>> "arg2, return";
>>>>>>         public static readonly String arg3_PROCEDURE_PARAMETER =
>>>>>> "arg3, return";
>>>>>> (略)
>>>>>>
>>>>>> 2008/10/23 19:15 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>> 久保(jflute)です。
>>>>>>>
>>>>>>>> [ESSR0071]SQLで例外が発生しました。理由はOracle.DataAccess.Client.OracleException
>>>>>>>> ORA-06550: 行1、列15:
>>>>>>>> PLS-00306: 'NAME'の呼出しで、引数の数または型が正しくありません。
>>>>>>>> ORA-06550: 行1、列7:
>>>>>>>
>>>>>>> PL/SQLまでは到達してるような気もします。
>>>>>>>
>>>>>>> 該当のPL/SQLは、SQL*Plus等から実行可能ですか?
>>>>>>> また、手動で作成したPmbのパラメータの定義(数とか)は
>>>>>>> 合っていますでしょうか?
>>>>>>>
>>>>>>> #
>>>>>>> # ちなみにパッケージ付きプロシージャのメタ情報自体が
>>>>>>> # 取得できてない(Pmbが作られない)のであれば、
>>>>>>> # パッケージ名を付与する以前の問題でしたね。。。
>>>>>>> #
>>>>>>>
>>>>>>> 2008/10/23 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>>> 久保(jflute)です。
>>>>>>>>
>>>>>>>> 森脇さん、
>>>>>>>> すいませんエラーはちょっと後で見させて頂きます。
>>>>>>>> (S2Dao.NETのプロシージャ作者の投稿を待つしか.....)
>>>>>>>>
>>>>>>>> ちょっと仕様の相談です。
>>>>>>>>
>>>>>>>> ご教授頂いた方法でプロシージャのパッケージを取得するようにしました。
>>>>>>>> メタ情報からパッケージ名が取得できたら、
>>>>>>>> SQL上のプロシージャ名を「パッケージ名.プロシージャ名」に
>>>>>>>> した方がよいでしょうか?(Java/C#両方)
>>>>>>>> (よくわからないならわからないでOKです)
>>>>>>>>
>>>>>>>> #
>>>>>>>> # Oracle限定にするかは要検討。。。
>>>>>>>> #
>>>>>>>>
>>>>>>>> 2008/10/23 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>> 森脇です
>>>>>>>>>
>>>>>>>>>> もし「パッケージ名.プロシージャ名」で呼び出せるのであれば、
>>>>>>>>>> DBFluteがSql2Entityで自動生成するProcedurePmbを参考に
>>>>>>>>>> 手動でPmbを作って、ProcedureNameにパッケージ名を付与すれば
>>>>>>>>>> 実行はできるかもしれません。(未検証)
>>>>>>>>> これは試して見たんですが例外が発生しました。
>>>>>>>>> で、そもそもS2Dao.NETが対応していない為発生しているのではと思って
>>>>>>>>> メールした次第です。
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 以下ログです。
>>>>>>>>>
>>>>>>>>> Message: Look! Read the message below.
>>>>>>>>> /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>>>>>>>>> The SQL failed to execute!
>>>>>>>>>
>>>>>>>>> [Advice]
>>>>>>>>> Please confirm the Exception message.
>>>>>>>>>
>>>>>>>>> [Exception]
>>>>>>>>> Seasar.Framework.Exceptions.SQLRuntimeException
>>>>>>>>> [ESSR0071]SQLで例外が発生しました。理由はOracle.DataAccess.Client.OracleException
>>>>>>>>> ORA-06550: 行1、列15:
>>>>>>>>> PLS-00306: 'NAME'の呼出しで、引数の数または型が正しくありません。
>>>>>>>>> ORA-06550: 行1、列7:
>>>>>>>>> PL/SQL: Statement ignored    場所
>>>>>>>>> Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32
>>>>>>>>> errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx*
>>>>>>>>> pOpoSqlValCtx, Object src, String procedure)
>>>>>>>>>   場所 Oracle.DataAccess.Client.OracleException.HandleError(Int32
>>>>>>>>> errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx,
>>>>>>>>> OpoSqlValCtx* pOpoSqlValCtx, Object src)
>>>>>>>>>   場所 Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
>>>>>>>>>   場所 Seasar.Framework.Util.CommandUtil.ExecuteNonQuery(IDataSource
>>>>>>>>> dataSource, IDbCommand cmd)
>>>>>>>>>
>>>>>>>>> [NextException]
>>>>>>>>> Oracle.DataAccess.Client.OracleException
>>>>>>>>> ORA-06550: 行1、列15:
>>>>>>>>> PLS-00306: 'NAME'の呼出しで、引数の数または型が正しくありません。
>>>>>>>>> ORA-06550: 行1、列7:
>>>>>>>>> PL/SQL: Statement ignored
>>>>>>>>>  ErrorCode = 6550
>>>>>>>>>  HelpLink  =
>>>>>>>>>
>>>>>>>>> [Behavior]
>>>>>>>>> CodeMstBhv.OutsideSql().Call()
>>>>>>>>>
>>>>>>>>> [OutsideSqlPath]
>>>>>>>>> CODE.NAME
>>>>>>>>>
>>>>>>>>> [ParameterBean]
>>>>>>>>> App.DB.ExDao.PmBean.NamePmb
>>>>>>>>> {,1,0}
>>>>>>>>>
>>>>>>>>> [Statement]
>>>>>>>>> Oracle.DataAccess.Client.OracleCommand
>>>>>>>>> * * * * * * * * * */
>>>>>>>>>
>>>>>>>>> 2008/10/23 17:21 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>> 久保(jflute)です。
>>>>>>>>>>
>>>>>>>>>> もし「パッケージ名.プロシージャ名」で呼び出せるのであれば、
>>>>>>>>>> DBFluteがSql2Entityで自動生成するProcedurePmbを参考に
>>>>>>>>>> 手動でPmbを作って、ProcedureNameにパッケージ名を付与すれば
>>>>>>>>>> 実行はできるかもしれません。(未検証)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2008/10/23 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>> 久保(jflute)です。
>>>>>>>>>>>
>>>>>>>>>>> 取り急ぎ、DBFluteでは意識して対応はしていません。
>>>>>>>>>>>
>>>>>>>>>>> ADO.NET(というかOracleのProvider)でどうやって、
>>>>>>>>>>> 指定して実行できるのかがよくわかっていません。
>>>>>>>>>>> (InternalProcedureHandlerクラスにてプロシージャを実行しています)
>>>>>>>>>>>
>>>>>>>>>>> 後は、パッケージ名がメタ情報として取得できるのかどうかも
>>>>>>>>>>> わかっていません。(というかそもそもアプローチしたことがないです)
>>>>>>>>>>>
>>>>>>>>>>> #
>>>>>>>>>>> # そもそもOracleでパッケージを使ったことがないので、
>>>>>>>>>>> # 申し訳ありませんが知識不足です。。。
>>>>>>>>>>> #
>>>>>>>>>>>
>>>>>>>>>>> 2008/10/23 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>>> 森脇と申します。
>>>>>>>>>>>>
>>>>>>>>>>>> 件名の通りなのですが、S2Dao.NET、DBFluteともOracleのパッケージには
>>>>>>>>>>>> 対応されていますでしょうか?
>>>>>>>>>>>>
>>>>>>>>>>>> S2Dao.NET のドキュメントを確認しましたが、Procedure属性の指定が
>>>>>>>>>>>> ・ストアプロシージャ名
>>>>>>>>>>>> ・スキーマ名.ストアドプロシージャ名
>>>>>>>>>>>> しか説明がありませんでしたので対応されていないのでしょうか?
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> seasar-dotnet mailing list
>>>>>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> seasar-dotnet mailing list
>>>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> seasar-dotnet mailing list
>>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>>>
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> seasar-dotnet mailing list
>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>
>>>>>> _______________________________________________
>>>>>> seasar-dotnet mailing list
>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>
>>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内