Question

Si vous créez un dblink Oracle, vous ne pouvez pas accéder directement aux colonnes LOB dans les tables cible.

Par exemple, vous créez un dblink avec :

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

Après cela, vous pouvez faire des choses comme :

select column_a, column_b 
from data_user.sample_table@TEST_LINK

Sauf si la colonne est un LOB, alors vous obtenez l'erreur :

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

C'est une restriction documentée.

La même page vous suggère de récupérer les valeurs dans une table locale, mais c'est...un peu brouillon :

CREATE TABLE tmp_hello 
AS SELECT column_a 
from data_user.sample_table@TEST_LINK

D'autres idées ?

Était-ce utile?

La solution

Ouais, c'est compliqué, mais je ne trouve pas de moyen de l'éviter.
Vous pouvez masquer une partie du désordre du client en plaçant la création de table temporaire dans une procédure stockée (et en utilisant "exécuter immédiatement" pour créer la table)
Une chose à laquelle vous devrez faire attention est les tables temporaires restantes (en cas d'échec au milieu d'une session, avant d'avoir eu le temps de le nettoyer) - vous pouvez planifier une tâche Oracle pour qu'elle s'exécute périodiquement et supprime toutes les tables restantes. .

Autres conseils

La meilleure solution consiste à utiliser une requête comme ci-dessous, où column_b est un BLOB :

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL

Vous pouvez utiliser des vues matérialisées pour gérer toute la gestion du « cache ».Ce n'est pas parfait mais fonctionne dans la plupart des cas :)

Pour les données de requête, la solution de user2015502 est la plus intelligente.Si vous souhaitez insérer ou mettre à jour des LOB À la base de données distante (insérer dans xxx@yyy ...), vous pouvez facilement utiliser du SQL dynamique pour cela.Voir ma solution ici:

Avez-vous un scénario précis en tête ?Par exemple, si le LOB contient des fichiers et que vous êtes sur l'intranet d'une entreprise, vous pouvez peut-être écrire une procédure stockée pour extraire les fichiers dans un répertoire connu du réseau et y accéder à partir de là.

Dans ce cas précis, la seule façon pour les deux systèmes de communiquer est d'utiliser le dblink.

De plus, la solution de table n'est pas si terrible, c'est juste compliqué de devoir "mettre en cache" les données de mon côté du dblink.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top