dblinkを介したOracle SQLタイプ
-
22-07-2019 - |
質問
AとB(Oracle 9)の2つのスキーマがあります。 AにはBへのdblinkがあります。BにはAから呼び出すパッケージがあります。Bパッケージのプロシージャはさまざまなカウント結果を返すことができ、この理由からコレクションを返す方が良いと思います。
create type B.tr_rad as object (
name varchar2(64)
,code number
,vendor number
,val varchar2(255)
,num number
);
create type B.tt_rad as varray(256) of B.tr_rad;
しかし、Aスキームでは、dblinkによるSQLタイプの使用がサポートされていないため、tt_radタイプを使用できません。 DBMS_SQLはカーソルをサポートしていません。同じOIDで型を作成することはできません。
一時テーブルを使用すると思います。しかし、最初はそれほど良くありません(リモート関数が値を返した後、呼び出し側はリモートテーブルからコレクションを選択する必要があります)。また、一時テーブルの処理が遅くなる恐れがあります。
別のインタラクションを知っているのは誰ですか?
解決
過去にも同様の問題がありました。その後、基本的にOracleのdbリンクは「壊れた」という結論に達しました。単純なSQLタイプ以外の場合(特にUDTの場合、CLOBSには問題があり、XMLTypeにも問題がある場合があります)。 OIDソリューションが機能するようになったら、幸運を祈ります。
私が頼った解決策は、DBリンクの代わりにJavaストアドプロシージャを使用することでした。
Javaストアドプロシージャの特性:
- 「型の豊富なセット」を返すことができます。ほぼすべての複雑な型(UDT、tables / arrays / varrays)を参照できます Oracleオンラインドキュメントをご覧ください。 Oracleは、DBLinkからよりも、javaから複雑な(またはリッチな)型をマーシャリングするのにはるかに優れています。
- Stored Javaは、「デフォルト接続」を取得できます。 (dbへのSQL接続と同じセッションで実行されます-認証の問題はありません。)
- Stored JavaはリモートDBでPL / SQLプロシージャを呼び出し、java JDBCレイヤーはリモートDBからマーシャリングを行います。
- 保存されたJavaは結果をパッケージ化し、SQLまたはPL / SQLレイヤーに結果を返します。
やや手間がかかりますが、Javaが少しあれば、「切り取りと貼り付け」ができるはずです。 Oracleのドキュメントとサンプルからソリューションを一緒に。
これが役立つことを願っています。
他のヒント
この既存のディスカッションを参照
代替の相互作用は、データベースリンクを持つ2つのデータベースの代わりに、スキーマAおよびBを持つ 1つのデータベースを持つことです。
私の解決策。 サイド B で、コレクションレコードのような一時テーブルを作成します。 A 側には、dblink経由でプロシージャを呼び出すDBMS_SQLラッパーがあります。このプロシージャは、一時テーブルに結果コレクションを書き込みます。リモート手順が正常に完了した後、リモート一時テーブルから結果を選択し、ローカルコレクションタイプに変換します。
制限 1.永続的なオブジェクト同期の必要性。 2. SQLクエリでAサイドプロシージャ(リモートプロシージャを呼び出す)を使用することはできません。 3.使用の複雑さ。