2008-09-01 25 views
11

Oracleのdblinkを作成すると、ターゲット表のLOB列に直接アクセスすることはできません。列がLOBである場合、その後、あなたがエラーを取得する場合を除きOracle分散データベースでLOBを処理する最適な方法

select column_a, column_b 
from [email protected]_LINK 

:あなたのようなものを行うことができます。この後

create database link TEST_LINK 
    connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID'; 

:たとえば、あなたがデータベース・リンクを作成

ORA-22992: cannot use LOB locators selected from remote tables 

これはa documented restrictionです。

同じページでは、ローカルテーブルに値をフェッチ示唆、それは...厄介の種類:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from [email protected]_LINK 

他のアイデア?

答えて

4

ええ、それは面倒です、私はそれを避ける方法を考えることができません。
テンポラリテーブルの作成をストアドプロシージャに入れて(テーブルを作成するために「即時実行」を使用して)、クライアントからの乱雑さを隠すことができます
注意する必要があるのは、一時テーブル(セッションの途中で何かが失敗した場合は、そのセッションをクリーンアップする必要があります)、残ったテーブルを定期的に実行および削除するようにOracleジョブをスケジュールできます。

0

具体的なシナリオはありますか? たとえば、LOBにファイルがあり、会社のイントラネット上にある場合は、ファイルをネットワーク上の既知のディレクトリに抽出し、そこからアクセスするためのストアドプロシージャを作成できます。

0

この特定のケースでは、2つのシステムが通信できる唯一の方法は、dblinkを使用することです。

また、テーブルソリューションはそれほどひどいわけではありません.dblinkの私の側にデータを「キャッシュ」するだけで面倒です。

1

materalizedビューを使用して、すべての「キャッシュ」管理を処理できます。 It'sは完璧なほとんどの場合で動作します:)

8

COLUMN_BがBLOBであるとして、以下のクエリを使用して、最善の解決策ではなく、クエリデータの場合

SELECT (select column_b from [email protected]_LINK) AS column_b FROM DUAL 
+3

これは魅力的です!インターネットでのベストアンサー! – gabrjan

+0

@ user2015502これをHibernateの式で試してみましたか?それはテーブルが見つからないと常に応答し、私は開発者で働いている私のクエリを持っています – eduyayo

+0

クエリをありがとうが、それは私のために動作しません。私が得るのは、サイズが0のBLOBです。このメソッドはまた、内部のselectをフィルタリングする必要があります。 '1行のサブクエリは複数の行を返します。 – detoro84

0

を、user2015502のソリューションは賢いです。 LOBのリモートデータベース(xxx @ yyy ...に挿入)を挿入または更新する場合は、簡単に動的SQLを使用できます。 my solution here:

関連する問題