Exécution d’une procédure distante avec type DATA1 en paramètre
J’ai N serveur avec le même programme : package Flux_trf qui utilise un type d’objet DATA1 créé pour la circonstance.
Sous le user : A1 du serveur A :
Code:
CREATE OR REPLACE TYPE DATA1 AS OBJECT ( d1 varchar2(10), d2 varchar2(20) );
Package Flux_trf
Dont une procedure trf_data(X in varchar2, Y in varchar2, d in out DATA1)
Cette procédure exécute de manière dynamique le transfert de données d’un user X vers un user Y comme cela :
Si même serveur
Code:
1 2
| w_requete := 'BEGIN '|| w_user_dest||'.Flux_trf.CreData(:1 ); END;';
execute immediate w_requete using IN OUT d; |
Si serveur distant
Code:
1 2
| w_requete := 'BEGIN '|| w_user_dest||'.Flux_trf.CreData(:1 ); END;';
execute immediate w_requete using IN OUT d; |
Sous le user A2 du même serveur A :
J’ai également le package Flux_trf.
Au départ j’avais créé également le type DATA1 sous le user A2, mais lors de l’exécution de la procédure j’avais le message : PLS-00306: numéro ou types d'arguments erronés
J’ai donc supprimé le type DATA1 du user A2 et créé un synonym public DATA1 pointant sur le type DATA1 du user A1.
Cela a bien fonctionné.
Seulement voilà il peut y avoir des serveurs distants
Donc sous le user B2 du serveur B , je pensais également crée un synonym public distant sur le user A1 avec un databaselink.
Mais lorsque j’accède à ce type de synonym distant DATA1 j’ai le message :
Citation:
ORA-00902: type de données non valide
Comment puis-je déclarer un type DATA1 unique dans le cas de plusieurs serveurs ou base Oracle différente ?
Tests basiques : même erreur
Meilleurs vœux à tous pour nouvelle année
Pour répondre à tes questions :
Les droits d’exécution sur le package sont corrects, mais c’est la variable de type DATA1 qui pose problème.
Le user B1 se connecte au serveur A via un Dblink et la connexion depuis le serveur B vers le serveur A via A1 fonctionne.
Ci-dessous les tests basiques que j’ai fait :
Sous user A1 serveur A j’exécute :
Code:
1 2 3 4 5 6 7 8
| CREATE OR REPLACE TYPE DATA1 AS OBJECT ( d1 varchar2(10), d2 varchar2(20) )
/
GRANT ALL ON DATA1 TO PUBLIC
/
CREATE table TOTO ( d1 varchar2(10), d2 varchar2(20) )
/
GRANT ALL ON TOTO TO PUBLIC
/ |
Sous user A2 serveur A l’exécution suivante est correcte :
Code:
1 2
| desc A1.DATA1
desc A1.TOTO |
Sous user B1 serveur B :
Code:
desc A1.TOTO@BDL_B_VERS_A
est correcte
Mais
Code:
desc A1.DATA1@BDL_B_VERS_A
me renvoie le message d’erreur :
Code:
ORA-00902: type de données non valide
Aurais-je oublié quelque chose ?