質問

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ストアドプロシージャの特性:

  1. 「型の豊富なセット」を返すことができます。ほぼすべての複雑な型(UDT、tables / arrays / varrays)を参照できます Oracleオンラインドキュメントをご覧ください。 Oracleは、DBLinkからよりも、javaから複雑な(またはリッチな)型をマーシャリングするのにはるかに優れています。
  2. Stored Javaは、「デフォルト接続」を取得できます。 (dbへのSQL接続と同じセッションで実行されます-認証の問題はありません。)
  3. Stored JavaはリモートDBでPL / SQLプロシージャを呼び出し、java JDBCレイヤーはリモートDBからマーシャリングを行います。
  4. 保存されたJavaは結果をパッケージ化し、SQLまたはPL / SQLレイヤーに結果を返します。

やや手間がかかりますが、Javaが少しあれば、「切り取りと貼り付け」ができるはずです。 Oracleのドキュメントとサンプルからソリューションを一緒に。

これが役立つことを願っています。

他のヒント

この既存のディスカッションを参照

dblinkを介したoracleユーザー定義型の参照

代替の相互作用は、データベースリンクを持つ2つのデータベースの代わりに、スキーマAおよびBを持つ 1つのデータベースを持つことです。

私の解決策。 サイド B で、コレクションレコードのような一時テーブルを作成します。 A 側には、dblink経由でプロシージャを呼び出すDBMS_SQLラッパーがあります。このプロシージャは、一時テーブルに結果コレクションを書き込みます。リモート手順が正常に完了した後、リモート一時テーブルから結果を選択し、ローカルコレクションタイプに変換します。

制限 1.永続的なオブジェクト同期の必要性。 2. SQLクエリでAサイドプロシージャ(リモートプロシージャを呼び出す)を使用することはできません。 3.使用の複雑さ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top