awaawaさん、おはようございます。
こういうときは、まずはDBリンクのストアドプロシージャとは、
どういう仕様のものなのかを提示できると良いと思います。
どういう風な構造でどういうDDLで作成してどういう風に呼び出すものか、
などなど。(DBリンクのストアドを知ってる可能性って多くないと思うので)
シノニムのDBリンクもOracle限定特別処理で実現しているので、
恐らくストアドプロシージャも特別処理が必要になりそうですね。
2011/9/28 awaawa <p1us3i...@gmail.com>:
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>
>
awaawaくん、DBリンクのストアドプロシージャは、
シノニム経由ではなく、直接呼び出しをするのかな?
いずれにせよ、現状ではできないかもしれないけど、
DBリンクのものって、シノニムで隠すのをよく見るので、
DBリンクのプロシージャシノニムに対応する方が
いいのかなと思って。
2011/9/28 kubo <dbf...@gmail.com>:
> いずれにせよ、現状ではできないかもしれないけど、
> DBリンクのものって、シノニムで隠すのをよく見るので、
> DBリンクのプロシージャシノニムに対応する方が
> いいのかなと思って。
いずれにせよ、DBリンクのプロシージャシノニムを作ると、
Docタスクで「落ちる」ということがわかったので対応します。
DBリンクのテーブルと区別がつかなくて、そのままテーブルと
同じように扱われてしまうので。その対応で、そのまま
データディクショナリを覗いてProcedurePmbを生成できればと。
DBリンクから直接の自動生成は、結局テーブルも同じ話なので、
基本的にはDBリンクはシノニムを経由すれば自動生成できる、
っていう感じの仕様かなぁ...
2011/9/28 kubo <dbf...@gmail.com>:
> 現状は直接呼び出す予定でいますが、シノニム経由でも問題ありません。
awaawaさん、申し訳ない。
プロシージャシノニムもAdditionalTableも挫折しましたぁ...
プロシージャシノニムのDocタスクでのエラーは回避。
自動生成となるとかなりの実装時間が必要で、
一旦中断します。ただ、いつかはやりたいところですね。
(Oracle周りのロジックをリファクタしないと)
AdditionalTableも意外に時間食いそうで、
ベタに書くくらいなら、awaawaさんの方でやってる
ダミーで一度 Pmb 作って手動でメンテしていくのと
大して変わらないので、現状ではそれでお願いします。
(テーブルのクラスは自前で作るとなったらつらいですが、
プロシージャであればそこまででないのでいざとなれば手動で)
2011/9/30 awaawa <p1us3i...@gmail.com>:
> awaawaさん、申し訳ない。
> プロシージャシノニムもAdditionalTableも挫折しましたぁ...
いや、DBリンクプロシージャシノニムは、
やはりちょっとアプローチしてみるか。
いかんね弱気になっちゃぁ。
でも、連続した集中時間と良い体調が必要なので、
少し調整してみます。
2011/9/30 kubo <dbf...@gmail.com>:
途中経過。
空っぽのProcedurePmb自体は作成できるようになりました。
引数とかのメタデータの取得がこれからです。
なんというか、本来OracleのJDBCドライバがやってくれることを、
自前でやってるって感じですね。データディクショナリの形式を
JDBCのメタデータに翻訳って感じで。
で、ひとつお願いがあるのだけど、
そのDBリンクのプロシージャを呼び出すプロシージャを
メインスキーマで作成して、そのプロシージャのPmbを
自動生成して呼び出すことってできるかな?
(アダプタ的なプロシージャを用意するイメージ)
実際にそうするってわけじゃなくて、
そういうことがOracleで可能かどうかを知りたい。
それが、DBFluteでDBリンクに対して、
どこまで突っ込んでいくかの指針になるので。
2011/10/1 awaawa <p1us3i...@gmail.com>:
DBFlute-0.9.9.1A-RC1 をお試し下さい。
DBリンクのプロシージャシノニムの ProcedurePmb が
自動生成されるはずです。ただし、STRUCT型や
パッケージ付きプロシージャには対応していません。
(プロシージャシノニムでは、もともとパッケージ付きは未サポート)
ExecutionMetaは、論理的には対応しているはずですが未確認です。
単純なIN, OUTのパラメータでの呼び出しのみ確認済みです。
ちなみに、DBリンクのシノニムの実体が
プロシージャシノニムの場合にも対応しています。
ここが限界な感じだね。
2011/10/1 kubo <dbf...@gmail.com>:
あら、パッケージプロシージャなのね。
何が難しいかと言うと、
そもそもOracleでシノニム経由でパッケージプロシージャが
呼び出せないというところにあります。メタデータ的に
DBFluteでの自動生成も厳しいところがありますが、
(ALL_SYNONYMS からパッケージを特定できない)
自動生成できたところで、シノニムだとパッケージ部分が
解決できないようで、DBリンクでなくても普通に呼び出す
とエラーになり話にならない。
ただ、Oracle10g XE での話なので、Oracle11g なら改善
されているかも。これは試してもらえるとありがたい。
パッケージプロシージャの場合、Oracle11gでは
ALL_SYNONYMSのTABLE_NAMEには何が入ってるかな?
あとは、dfprop に「プロシージャ名@リンク名」を
ベタに入れたら自動生成されるようにって頑張れなくも
ないかもですが、アダプタプロシージャができるんなら、
その方がシンプルで管理しやすいように思えます。
いずれにせよ、自分ならそういう風にするかも。
シノニムも他のスキーマのオブジェクトを直接触らない
ようにと作ったりするものだから、同じような感じで。
2011/10/2 awaawa <p1us3i...@gmail.com>:
> 何はともあれ、oracle11gで確認してみます。
> (アダプタプロシージャとALL_SYNONYMSの確認。)
よろしく!
ちなみに、Oracle10g XE だと、
CREATE SYNONYM SYNONYM_MAIN_PKG_PROCEDURE
FOR MAIN_PKG.SP_PKG_NO_PARAMETER;
とパッケージプロシージャのシノニムを作成して、
call SYNONYM_MAIN_PKG_PROCEDURE()
とすると、
Error
[row:1,col:6] ORA-04045:
EXAMPLEDB.SYNONYM_MAIN_PKG_PROCEDUREの再コンパイルまたは再検証中にエラーが発生しました
ORA-00980: シノニム変換が無効です。
※cal MAIN_PKG.SP_PKG_NO_PARAMETER() なら実行可能
となって、ALL_SYNONYMSを見ると、
TABLE_OWNER が MAIN_PKG (パッケージ名)で、
TABLE_NAME が SP_PKG_NO_PARAMETER と
なっています。
「どのスキーマのプロシージャ?」って情報が抜け落ちてて、
自動生成がでちょっと困るという点に加え(頑張ればなんとか!?)、
いずれにせよ実行できないじゃんってところが未サポートの理由。
2011/10/2 awaawa <p1us3i...@gmail.com>:
同じくRC1(上書き)で、
outsideSqlDefinitionMap.dfprop にて、
; targetProcedureNameList = list:{
; NEXT_PKG.SP_PKG_NO_PARAMETER@NEXT_LINK
; NEXT_PKG.SP_PKG_IN_OUT_PARAMETER@NEXT_LINK
}
と指定すると、自動生成できるようにしました。
@が付いている場合は、追加的な意味合いになるので、
これを指定したからといって他のプロシージャが自動生成
されなくなるわけではありません。(その判定とは独立)
名前は IncludedProcedureToDBLink、Oracle限定機能。
dbflute-oracle-exampleにて簡単なものは実際にテストしてます。
確認事項をまとめると:
A. アダプタプロシージャからDBリンクのプロシージャが呼び出せるか?
B. Oracle11gにてシノニムでパッケージプロシージャが呼び出せるか?
C. IncludedProcedureToDBLink がそっちの環境でちゃんと動くか?
という感じ。
2011/10/2 kubo <dbf...@gmail.com>:
awaawaさん、確認ありがとう!
よかったよかった。
>> B. Oracle11gにてシノニムでパッケージプロシージャが呼び出せるか?
> Object Browserからプロシージャ実行。OK
> 自動生成。NG
この自動生成NGってどういうこと?
下のように、パッケージ名だけをシノニムにした場合に、
DBFluteで自動生成されなかったってこと?
> ※パッケージプロシージャのシノニム作成自体は、パッケージ名までの指定でいけました。
> シノニム作成 CREATE SYNONYM SYNONYM_MAIN_PKG FOR MAIN_PKG;
> 実行 SYNONYM_MAIN_PKG.SP_PKG_NO_PARAMETER()
なるほど、そういう使い方ならって感じなんだね。
というかややこしい、この場合はプロシージャシノニムではなく、
「パッケージ(だけ)シノニム」という別の概念と言えるかもね。
これはこれでプロシージャシノニムの処理の中で特別処理として
扱わないとダメだね。
あとこの場合、DBリンクのパッケージシノニムって
作れるのかなぁ!?!?
2011/10/4 awaawa <p1us3i...@gmail.com>:
>> この自動生成NGってどういうこと?
>> あとこの場合、DBリンクのパッケージシノニムって 作れるのかなぁ!?!?
> 昨日動作確認・報告したのが、DBリンクのパッケージシノニムでした。
> この場合は、自動生成されませんでした。
>
> なので、まずは普通(DBリンクでない)のパッケージシノニムをやらないとだめですね。
> 今夜報告します!
パッケージシノニムはDBFluteとして処理もしてないので、
自動生成はされないはずです。ただ、シノニム作る時って、
CREATE SYNONYM ... FOR MAIN_PKG@LINK_NAME
みたいに作るのかな???
どちらかというと Oracle11g で、パッケージプロシージャを
まるごとシノニムにした場合に実行できるかどうかを
確認してみて欲しい。
CREATE SYNONYM ... FOR MAIN_PKG.SP_PKG_NO_PARAMETER
まあ、これはたぶんだめなんだろうけど...
パッケージプロシージャでそのパッケージのプロシージャを
全て自動生成することはできなくはないだろうけど、
一つのパッケージにたくさんプロシージャがあったりすると、
かなり乱暴なことになりそう...パッケージ名だけをシノニムって、
ほとんど意味ないようなきもするので、これは保留かな。
(dfpropでDBリンクプロシージャを自動生成できるようにしたしね)
>> CREATE SYNONYM ... FOR MAIN_PKG.SP_PKG_NO_PARAMETER
> これはだめですね。MAIN_PKGをスキーマとして検知してしまうみたいで。
なるほど。じゃあ、このパターンはそもそもダメなんだね。
あんま気にしなくて良いんだな...
したら、パッケージシノニムが将来の課題ということで。
実装が恋しくてたまらなくなったらときにやります。
(ときどきあるんだよ)
2011/10/5 awaawa <p1us3i...@gmail.com>: