Question

J'ai deux schémas: A et B (Oracle 9). En A, il y a un lien vers B. En B, il y a un paquet que j’appelle de A. Les procédures dans le paquet B peuvent renvoyer différents résultats de comptage et je pense que renvoyer une collection est un meilleur moyen pour cette raison.

create type B.tr_rad as object (
  name     varchar2(64)
 ,code     number
 ,vendor   number
 ,val      varchar2(255)
 ,num      number
);

create type B.tt_rad as varray(256) of B.tr_rad;

Mais à partir d'un schéma, je ne peux pas utiliser le type tt_rad car l'utilisation de types SQL par dblink n'est pas prise en charge. DBMS_SQL n'est pas pris en charge par les curseurs. Créer des types avec le même OID est impossible.

Je pense utiliser des tables temporaires. Mais premièrement, ce n’est pas très bon (une fois que la fonction distante a renvoyé la valeur, le côté appelant doit sélectionner la collecte dans la table distante). Et on craint un ralentissement du travail avec les tables temporaires.

Peut-être qui connaît l'interaction alternative?

Était-ce utile?

La solution

J'ai eu des problèmes similaires dans le passé. Je suis ensuite arrivé à la conclusion que, fondamentalement, les liens de base de données d’Oracle sont "cassés". pour tout sauf les types SQL simples (en particulier les UDT, CLOBS peut avoir des problèmes, XMLType peut aussi). Si vous pouvez faire fonctionner la solution OID, alors bonne chance.

La solution à laquelle j'ai eu recours consistait à utiliser une procédure stockée Java au lieu du lien de base de données.

Caractéristiques de la procédure stockée Java:

  1. Peut renvoyer un "riche ensemble de types", à peu près tous les types complexes (UDT, tables / tableaux / varrays), voir Documentation en ligne Oracle pour plus de détails. Oracle réussit beaucoup mieux à rassembler des types complexes (ou riches) à partir de Java que d’un DBLink.
  2. Java stocké peut acquérir la " connexion par défaut " (s'exécute dans la même session que la connexion SQL à la base de données - aucun problème d'authentification).
  3. Java stocké appelle le processus PL / SQL sur la base de données distante et la couche JDBC java effectue le marshaling à partir de la base de données distante.
  4. Java stocké compense le résultat et le renvoie dans la couche SQL ou PL / SQL.

C’est un peu de travail, mais si vous avez un peu de java, vous devriez pouvoir "couper et coller". une solution réunie dans la documentation et l'exemple Oracle.

J'espère que cela vous aidera.

Autres conseils

Une autre possibilité consiste à créer une une base de données avec les schémas A et B au lieu de deux bases de données avec un lien de base de données.

Ma solution. Sur le côté B , je crée une table temporaire comme l’enregistrement de la collection. Du côté A , j'ai un wrapper DBMS_SQL qui appelle la procédure via dblink. Cette procédure écrit la collection de résultats dans la table temporaire. Une fois la procédure distante terminée avec succès, je sélectionne les résultats de la table temporaire distante et les transforme en type de collecte locale.

Limitations 1. la nécessité d'une synchronisation permanente des objets. 2. impossibilité utiliser une procédure côté utilisateur (cette procédure d'appel distant) dans une requête SQL. 3. la complexité d'utilisation.

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