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

kubo [E-MAIL ADDRESS DELETED]
2008年 10月 30日 (木) 10:39:03 JST


久保(jflute)です。

森脇さん、おはようございます。
ご報告ありがとうございます!
原因はOracleのファンクションに限定した話だけでなく、
別のDBでも戻り値のあるストアドが(多分)バグっていたので、
良い修正ができました。

で、ちょっと後学のためにお聞きしたいのですが、
ファンクションの用途って、自分の個人的な感覚では
「SQLの中に組み込んで利用する」というのをイメージ
していて、あまりアプリ(JavaやC#)側から直接呼び出す
ことはあまり無いのでは!?と思っていたのですが、
(少なくともプロシージャとファンクションが両方サポート
 されているDBMSにおいては)
森脇さんのところではどうなのでしょう?

#
# 自分の周りの人何人かにちょっと聞いても
# 同じような意識ではありましたので。
#

2008/10/30 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
> 久保さん
> 森脇です
>
> dbflute-0.8.3にてファンクション、パッケージのファンクションが
> 正常に実行されることをMbUnitで確認しました。
> 対応ありがとうございました。
>
>
> 2008/10/29 23:54 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>> 森脇です
>>
>>> http://dbflute.sandbox.seasar.org/download/dbflute/dbflute-0.8.3.zip
>>> (DBFlute-0.8.3のSNAPSHOT)
>>>
>>> にて対応しました。
>>> お手数ですが、ご確認頂けますでしょうか?
>> おお、迅速な対応ありがとうございます。
>> 明日にでも試してみます。
>>
>>
>> 2008/10/29 23:48 kubo <[E-MAIL ADDRESS DELETED]>:
>>> 久保(jflute)です。
>>>
>>> http://dbflute.sandbox.seasar.org/download/dbflute/dbflute-0.8.3.zip
>>> (DBFlute-0.8.3のSNAPSHOT)
>>>
>>> にて対応しました。
>>> お手数ですが、ご確認頂けますでしょうか?
>>> (dbflute-noracle-exampleにてExampleもございます)
>>>
>>> また、C#版DBFluteはテスト環境がMySQLとOracleしか
>>> ありません。(Java版は7DB全てあるのですが...)
>>> 他のDBでのプロシージャ実行に影響あるかどうかが
>>> 確認できませんので、もしよろしければ、
>>> ML読んでるどなたか試して頂けると非常に助かります。
>>>
>>> 2008/10/29 kubo <[E-MAIL ADDRESS DELETED]>:
>>>> 久保(jflute)です。
>>>>
>>>>> パラメータが存在しないファンクションにも関わらず
>>>>> 「'Xxx'の呼出しで、引数の数または型が正しくありません」
>>>>> というエラーになりました。
>>>>> ADO.NETの呼び出しで何か工夫しないといけないのかもしれません。
>>>>
>>>> ファンクションは、戻り値があるというところが
>>>> プロシージャと違うところですが(Oracleの場合)、
>>>> そのハンドリングがうまくいっていないようでした。
>>>> Javaでは戻り値は内部的にOUTパラメータとして
>>>> 扱うことで取得することができましたが、C#では
>>>> 違うようなので修正します。
>>>> (Exampleで試し実装して実行できました)
>>>>
>>>> 2008/10/29 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>> 久保(jflute)です。
>>>>>
>>>>> C#版DBFlute + Oracleストアドファンクションで
>>>>> 同じエラーが再現しました。
>>>>> (dbflute-noracle-exampleにてExampleをコミットしました)
>>>>>
>>>>> パラメータが存在しないファンクションにも関わらず
>>>>> 「'Xxx'の呼出しで、引数の数または型が正しくありません」
>>>>> というエラーになりました。
>>>>> ADO.NETの呼び出しで何か工夫しないといけないのかもしれません。
>>>>> (どなたかADO.NETからファンクションを呼び出した
>>>>> 経験のある方いらっしゃらないでしょうか!?)
>>>>>
>>>>> 2008/10/29 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>>> 森脇です。
>>>>>>
>>>>>>> すいません、そのファンクションでのエラー内容は
>>>>>>> 以前のメールでもらったのと同じ内容でしょうか?
>>>>>> すいません、ちょっと環境が無いので確認できませんが
>>>>>> たしか同じ内容だったはずです。
>>>>>>
>>>>>>
>>>>>> 2008/10/29 18:07 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>> 久保(jflute)です。
>>>>>>>
>>>>>>>>> プロシージャ、パッケージのプロシージャは実行できましたが、、
>>>>>>>>> ファンクション、パッケージのファンクションはエラーになりました。
>>>>>>>
>>>>>>> すいません、そのファンクションでのエラー内容は
>>>>>>> 以前のメールでもらったのと同じ内容でしょうか?
>>>>>>>
>>>>>>> 2008/10/29 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>>> 久保(jflute)です。
>>>>>>>>
>>>>>>>> 森脇さん、こんばんは
>>>>>>>>
>>>>>>>> 取り急ぎコメントします。
>>>>>>>>
>>>>>>>>> プロシージャ、パッケージのプロシージャは実行できましたが、、
>>>>>>>>> ファンクション、パッケージのファンクションはエラーになりました。
>>>>>>>> なるほど、了解です。
>>>>>>>> ポイントはファンクションのようですね。
>>>>>>>>
>>>>>>>> ファンクションに関しては、Example上では
>>>>>>>>
>>>>>>>> Java版:ファンクションOK、パッケージファンクション未確認
>>>>>>>> C#版:両方とも未確認
>>>>>>>>
>>>>>>>> です。
>>>>>>>> ちょと後で試してみます。
>>>>>>>> (夜になります)
>>>>>>>>
>>>>>>>> 2008/10/29 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>> 藤井さん
>>>>>>>>> 森脇です
>>>>>>>>>
>>>>>>>>> 回答ありがとうございます。
>>>>>>>>>
>>>>>>>>>> とあるので、ストアド?ファンクション?のDDLの方から一度確認して
>>>>>>>>>> いただけないでしょうか。
>>>>>>>>> SQL Plusで実行してみましたが問題なく実行されました。
>>>>>>>>>
>>>>>>>>> DBFluteからではなくS2DAO.NETで直接呼べるか試してみます。
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 2008/10/27 2:19 Hiroaki Fujii <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>> コミッタの藤井です。
>>>>>>>>>>
>>>>>>>>>> ご返事が遅くなり、申し訳ありません。
>>>>>>>>>>
>>>>>>>>>> Quillを使った結果しか試せてませんが、次のようなinterfaceを
>>>>>>>>>> 使ってテストしました。
>>>>>>>>>> 「パッケージ.ファンクション」形式です。
>>>>>>>>>>
>>>>>>>>>> [S2Dao]
>>>>>>>>>> [Implementation]
>>>>>>>>>> [Bean(typeof (SampleDto))]
>>>>>>>>>> public interface IHoge
>>>>>>>>>> {
>>>>>>>>>>    [Procedure("test_pack.get_amount")]
>>>>>>>>>>    int GetAmount(int id);
>>>>>>>>>>
>>>>>>>>>>    [Procedure("test_pack.get_name")]
>>>>>>>>>>    string getName(int id, int amount);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> S2DAO.NET側では特に問題なく、実行できました。
>>>>>>>>>>
>>>>>>>>>> エラーを見ると、
>>>>>>>>>>> ORA-06550: 行1、列15:
>>>>>>>>>>> PLS-00306: 'NAME'の呼出しで、引数の数または型が正しくありません。
>>>>>>>>>>> ORA-06550: 行1、列7:
>>>>>>>>>> とあるので、ストアド?ファンクション?のDDLの方から一度確認して
>>>>>>>>>> いただけないでしょうか。
>>>>>>>>>>
>>>>>>>>>> よろしくお願いします。
>>>>>>>>>>
>>>>>>>>>> k.moriwaki さんは書きました:
>>>>>>>>>>> 森脇です
>>>>>>>>>>>
>>>>>>>>>>>> もし「パッケージ名.プロシージャ名」で呼び出せるのであれば、
>>>>>>>>>>>> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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