2008-09-01 16 views
11

Wenn Sie einen Oracle-DBlink erstellen, können Sie nicht direkt auf LOB-Spalten in den Zieltabellen zugreifen.Die beste Methode zum Verwalten von LOBs in verteilten Oracle-Datenbanken

So erstellen Sie eine dblink mit:

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

Danach Sie Sachen tun können, wie:

select column_a, column_b 
from [email protected]_LINK 

Außer, wenn die Spalte ein LOB ist, dann Sie den Fehler:

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

Dies ist a documented restriction.

Die gleiche Seite schlägt man die Werte in einer lokalen Tabelle holen, aber das ist ... irgendwie chaotisch:

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

Jede andere Ideen?

Antwort

4

Ja, es ist chaotisch, ich kann mir keinen Weg vorstellen, es zu vermeiden.
Sie könnten etwas von der Unordnung vom Client verbergen, indem Sie die temporäre Tabellenerstellung in eine gespeicherte Prozedur setzen (und "execute sofort" verwenden, um sie zu erstellen)
Eine Sache, auf die Sie achten müssen, ist über temporäre Tabellen (Sollte etwas während einer Sitzung fehlschlagen, bevor Sie Zeit hatten, es zu bereinigen) - Sie könnten einen Oracle-Job planen, um regelmäßig Tabellen zu löschen und zu entfernen.

0

Haben Sie ein bestimmtes Szenario im Kopf? Wenn beispielsweise das LOB Dateien enthält und Sie sich in einem Firmenintranet befinden, können Sie möglicherweise eine gespeicherte Prozedur schreiben, um die Dateien in ein bekanntes Verzeichnis im Netzwerk zu extrahieren und von dort auf sie zuzugreifen.

0

In diesem speziellen Fall können die beiden Systeme nur über den DBlink kommunizieren.

Auch die Tabellenlösung ist nicht so schlimm, es ist einfach chaotisch, die Daten auf meiner Seite des DBlink "zwischenzuspeichern".

1

Sie könnten materialisierte Ansichten verwenden, um alle "Cache" -Management zu behandeln. Es ist nicht perfekt, aber funktioniert in den meisten Fällen :)

8

Die beste Lösung, die durch eine Abfrage, wie unten verwenden, wo column_b ein BLOB ist:

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

Das funktioniert wie ein Zauber !!! Beste Antwort im Internet! – gabrjan

+0

@ user2015502 hast du das in einer Hibernate Formel versucht? es antwortet immer als Tabelle nicht gefunden und ich habe meine Abfrage in Entwickler – eduyayo

+0

Dank für die Abfrage, aber es funktioniert nicht für mich. Was ich bekomme, ist ein BLOB mit der Größe 0. Diese Methode benötigt auch die innere Auswahl, um zu filtern: 'Einzelzeilen-Unterabfrage gibt mehr als eine Zeile zurück. – detoro84

0

Für Abfragedaten, die Lösung von user2015502 ist die klügste . Wenn Sie LOBs AT die entfernte Datenbank einfügen oder aktualisieren möchten (Einfügen in xxx @ yyy ...), können Sie dafür einfach dynamisches SQL verwenden. Siehe my solution here: