1

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;

しかし、dblink による SQL 型の使用がサポートされていないため、A スキームからは tt_rad 型を使用できません。DBMS_SQL はサポートされていないカーソルです。同じ OID を持つタイプを作成することはできません。

一時テーブルを使用すると思います。しかし、まずそれはあまり良くありません (リモート関数が値を返した後、呼び出し側はリモート テーブルからコレクションを選択する必要があります)。また、一時テーブルでの作業が遅くなる恐れがあります。

おそらく、代替相互作用を知っているのは誰ですか?

4

4 に答える 4

1

私は過去に同様の問題を抱えていました。次に、基本的にOracleのdbリンクは単純なSQLタイプ以外では「壊れている」という結論に達しました(特にUDT、CLOBSには問題がある可能性があり、XMLTypeにも問題がある可能性があります)。OID ソリューションを機能させることができれば、幸運を祈ります。

私が頼った解決策は、DB リンクの代わりに Java ストアド プロシージャを使用することでした。

Java ストアド プロシージャの特徴:

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

少し手間がかかりますが、Java が少しあれば、Oracle のドキュメントとサンプルからソリューションを「カット アンド ペースト」することができるはずです。

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

于 2009-03-13T21:40:13.193 に答える
0

この既存のディスカッションを参照してください

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

于 2009-03-13T11:36:21.520 に答える
0

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

制限事項 1. 永続的なオブジェクト同期の必要性。2. SQL クエリで A 側のプロシージャ (リモート プロシージャを呼び出す) を使用できない。3. 使用の複雑さ。

于 2009-03-17T09:03:25.873 に答える