Beste Möglichkeit, LOBs in verteilten Oracle-Datenbanken zu verwalten
-
09-06-2019 - |
Frage
Wenn Sie einen Oracle-Datenbanklink erstellen, können Sie nicht direkt auf LOB-Spalten in den Zieltabellen zugreifen.
Sie erstellen beispielsweise einen Dblink mit:
create database link TEST_LINK
connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';
Danach können Sie Dinge tun wie:
select column_a, column_b
from data_user.sample_table@TEST_LINK
Außer wenn es sich bei der Spalte um ein LOB handelt, erhalten Sie die Fehlermeldung:
ORA-22992: cannot use LOB locators selected from remote tables
Das ist eine dokumentierte Einschränkung.
Auf derselben Seite wird vorgeschlagen, die Werte in eine lokale Tabelle abzurufen, aber das ist ...irgendwie chaotisch:
CREATE TABLE tmp_hello
AS SELECT column_a
from data_user.sample_table@TEST_LINK
Irgendwelche anderen Ideen?
Lösung
Ja, es ist chaotisch, ich kann mir allerdings keinen Weg vorstellen, es zu vermeiden.
Sie könnten einen Teil der Unordnung vor dem Client verbergen, indem Sie die temporäre Tabellenerstellung in einer gespeicherten Prozedur ablegen (und „sofort ausführen“ verwenden, um die Tabelle zu erstellen).
Eine Sache, auf die Sie achten müssen, sind verbleibende temporäre Tabellen (sollte in der Mitte einer Sitzung etwas fehlschlagen, bevor Sie Zeit zum Bereinigen hatten) – Sie könnten einen Oracle-Job so planen, dass er regelmäßig ausgeführt wird und alle verbleibenden Tabellen entfernt .
Andere Tipps
Die beste Lösung ist die Verwendung einer Abfrage wie unten, wobei „columne_b“ ein BLOB ist:
SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
Sie könnten materialisierte Ansichten verwenden, um die gesamte „Cache“-Verwaltung zu übernehmen.Es ist nicht perfekt, funktioniert aber in den meisten Fällen :)
Für Abfragedaten ist die Lösung von user2015502 die intelligenteste.Wenn Sie LOBs einfügen oder aktualisieren möchten BEI In der entfernten Datenbank (einfügen in xxx@yyy ...) können Sie dafür problemlos dynamisches SQL verwenden.Sehen meine Lösung hier:
Haben Sie ein bestimmtes Szenario im Sinn?Wenn das LOB beispielsweise 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 aus darauf zuzugreifen.
In diesem speziellen Fall können die beiden Systeme nur über den Dblink kommunizieren.
Außerdem ist die Tabellenlösung nicht so schlimm, es ist nur chaotisch, die Daten auf meiner Seite des Dblinks „zwischenspeichern“ zu müssen.