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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top