2009-03-13 8 views
1

私はAとBの2つのスキーマ(Oracle 9)を持っています。 Aでは、Bへのdblinkがあります。Bでは、Aから呼び出されるパッケージがあります.Bパッケージのプロシージャは、さまざまなカウント結果を返すことができます。コレクションを返す方が良い理由です。Oracleのsqlタイプがdblinkより

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; 

しかし、データベース・リンクによってSQL-タイプを使用してはサポートされていないので、私はtt_radタイプを使用することはできませんスキームから。 DBMS_SQLはサポートされていないカーソルです。同じOIDを持つ型の作成は不可能です。

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

多分代替の相互作用を知っている人はいますか?

答えて

1

私は過去に同様の問題を抱えていました。そして、基本的にOracleのdbリンクは、単純なSQL型(特にUDT、CLOBSに問題がある可能性がありますが、XMLTypeも同様)のために「壊れている」という結論に達しました。あなたがOIDの解決策を得ることができる場合は、あなたに幸運。

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

特性:

  1. は、「種類の豊富なセット」を返すだけでは複雑なタイプのすべて(UDTの、テーブル/配列/ VARRAY)の詳細については Oracle online documentationを見ることができます。 Oracleは、DBLinkよりもJavaから複雑な(またはリッチな)型をマーシャリングする作業がはるかに優れています。
  2. ストアドJavaは「デフォルト接続」(dbとのSQL接続と同じセッションで実行されますが、認証の問題はありません)を取得できます。
  3. ストアド・JavaはリモートDBのPL/SQLプロシージャをコールし、java JDBCレイヤーはリモートDBからマーシャリングを行います。
  4. ストアド・Javaは結果をパッケージ化し、結果をSQLまたはPL/SQL層に戻します。

これはちょっとした作業ですが、Javaのほうが少しでもあれば、Oracleのマニュアルとサンプルからソリューションをまとめてカットアンドペーストすることができます。

こちらがお役に立てば幸いです。

+0

OIDソリューションは私のマシン上で動作します。どのOracleのバージョンを使用しましたか? – tuinstoel

+0

これはかなり前のことでした(おそらく8、おそらく9i)。私の具体的な問題は、CLOBSまたはVARCHAR2(4000)が爆発したことでした。 javaパスを使用すると、DBLinkの制限を回避できます。 –

+0

8と9は少し古いです。私のマシンではOIDを使用していますが、Oracle 11.1からOracle 10.2へのリンクを作成しました。 – tuinstoel

0

は、代替の相互作用は、スキーマAとBとのデータベースの代わりに、データベース・リンクを持つ2つのデータベースを持つことである。この既存の議論

referencing oracle user defined types over dblink

+0

私は質問を投稿する前にこれを読む – drnk

0

を参照してください。

+0

いいえ、その分散データベースネットワーク。中心の中心部と周囲の多くのポイント。 dblink - それは最も速く、好ましい方法です。 – drnk

0

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

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