Il modo migliore per gestire i LOB nei database distribuiti Oracle
-
09-06-2019 - |
Domanda
Se crei un dblink Oracle non puoi accedere direttamente alle colonne LOB nelle tabelle di destinazione.
Ad esempio, crei un dblink con:
create database link TEST_LINK
connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';
Dopodiché puoi fare cose come:
select column_a, column_b
from data_user.sample_table@TEST_LINK
Tranne se la colonna è un LOB, viene visualizzato l'errore:
ORA-22992: cannot use LOB locators selected from remote tables
Questo è una restrizione documentata.
La stessa pagina suggerisce di recuperare i valori in una tabella locale, ma questo è...un po' disordinato:
CREATE TABLE tmp_hello
AS SELECT column_a
from data_user.sample_table@TEST_LINK
Altre idee?
Soluzione
Sì, è complicato, però non riesco a pensare a un modo per evitarlo.
Potresti nascondere parte del disordine al client inserendo la creazione della tabella temporanea in una procedura memorizzata (e utilizzando "esegui immediato" per creare la tabella)
Una cosa a cui dovrai prestare attenzione sono le tabelle temporanee rimaste (se qualcosa dovesse fallire a metà di una sessione, prima di aver avuto il tempo di ripulirlo): potresti pianificare un lavoro Oracle da eseguire periodicamente e rimuovere eventuali tabelle rimanenti .
Altri suggerimenti
La soluzione migliore utilizzando una query come di seguito, dove column_b è un BLOB:
SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
È possibile utilizzare viste materializzate per gestire tutta la gestione della "cache".Non è perfetto ma funziona nella maggior parte dei casi :)
Per i dati delle query, la soluzione di user2015502 è la più intelligente.Se desideri inserire o aggiornare LOB A il database remoto (inserisci in xxx@yyy ...) puoi facilmente utilizzare SQL dinamico per questo.Vedere la mia soluzione qui:
Hai in mente uno scenario specifico?Ad esempio, se la LOB contiene file e ci si trova in una intranet aziendale, è possibile scrivere una procedura memorizzata per estrarre i file in una directory nota sulla rete e accedervi da lì.
In questo caso specifico l'unico modo in cui i due sistemi possono comunicare è utilizzare il dblink.
Inoltre, la soluzione della tabella non è poi così terribile, è semplicemente complicato dover "mettere nella cache" i dati sul mio lato del dblink.