ORA-22992 und Oracles Restriktionen für Lobs

Eine der besten Eigenschaften der Oracle Datenbank ist die Möglichkeit zwei von einander entfernte Datenbanken über einen DB Link zu koppeln.
So sind Abfragen auf entfernten Tabelle kein Problem:

select * from tabellenname@dblinkname;

Was ich bis heute nicht wusste ist, dass dies nur funktioniert solange in der Tabelle keine Lobs (Spalten vom Typ clob oder blob) enthalten sind. Wenn man es trotzdem tut, bekommt man einen ORA-22992 cannot use LOB locators selected from remote tables.

Laut Oracle sind mit entfernten Lobs nämlich nur folgende Statements erlaubt:

CREATE TABLE t AS SELECT * FROM table1@remote_site;
INSERT INTO t SELECT * FROM table1@remote_site;
UPDATE t SET lobcol = (SELECT lobcol FROM table1@remote_site);
INSERT INTO table1@remote_site ...
UPDATE table1@remote_site ...
DELETE FROM table1@remote_site ...

Verboten sind dagegen:

SELECT lobcol FROM table1@remote_site;
INSERT INTO lobtable SELECT type1.lobattr FROM 
    table1@remote_site;
SELECT DBMS_LOB.getlength(lobcol) FROM table1@remote_site;

Was kann man tun?

Bei Binary Lobs (z.B. Bildern) hat man aus meiner Sicht keine andere Möglichkeit als sie sich mit den o.a. Statements (create as, update) in die lokale Datenbank zu kopieren.
Für den lesenden Zugriff auf Character Lobs (z.B. lange Texte) kann es ausreichen, die Daten auf der entfernten Datenbank mittels einer Funktion in den Datentyp varchar2 umzuwandeln und über eine View, die diese Funktion benutzt nach außen zu kapseln. Das könnte so aussehen:

entfernte Datenbank:

create or replace view viw_clob_tabelle
as
select spalte1
, dbms_lob.substr(clobSpalte,4000,1) clobText
from clobTabelle;

lokale Datenbank:

select spalte1 , clobText from viw_clob_tabelle@dblinkname;

Allerdings werden dabei nur die ersten 4000 Zeichen des CLOB’s gelesen, da dass die Längenbeschränkung vom Datentyp varchar2 ist, der von dbms_lob.substr zurückgegeben wird. Aber oft reicht dies aus.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: