IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Exécution d’une procédure distante avec type DATA1 en paramètre


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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 ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Pour moi lorsque tu te connectes via le serveur B au serveur A tu le fais via un user A3 créé sur le seveur A.

    Donc si le user A3 est correctement configuré (cf a les droits d'exécution sur le package et sur le type DATA1) ça devrait être bon... mais je ne suis pas trop sûr et évidemment je n'ai pas fait de test, les prolématiques via DBlink obligeant à créer une autre base...

    Peux tu nous préciser comment le user B1 se connecte STP ?

    Pour faire basique as tu testé une connexion depuis le serveur B vers le serveur A via le user A1, juste pour s'assurer en dev de la faisabilité ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut 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 sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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 sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    desc A1.DATA1
    desc A1.TOTO

    Sous user B1 serveur B :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    desc A1.TOTO@BDL_B_VERS_A
    est correcte

    Mais
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    desc A1.DATA1@BDL_B_VERS_A
    me renvoie le message d’erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00902: type de données non valide
    Aurais-je oublié quelque chose ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Apparemment il faut assigner un OID, mais je n'ai jamais testé, j'éspère que j'ai bien compris.
    Sinon pour le desc il y a effectivement des limitations via DBlink.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Restriction on Using User-Defined Types with a Remote Database

    Restriction on Using User-Defined Types with a Remote Database
    User-defined types (specifically, types declared with a SQL CREATE TYPE statement, as opposed to types declared within a PL/SQL package) are currently useful only within a single database. You cannot use a database link to do any of the following:

    •Connect to a remote database to select, insert, or update a user-defined type or an object REF on a remote table

    You can use the CREATE TYPE statement with the optional keyword OID to create a user-specified object identifier (OID) that allows an object type to be used in multiple databases. See the discussion on assigning an OID to an object type in the Oracle Database Data Cartridge Developer's Guide.

    •Use database links within PL/SQL code to declare a local variable of a remote user-defined type

    •Convey a user-defined type argument or return value in a PL/SQL remote procedure call.


  6. #6
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 674
    Points
    674
    Par défaut
    Il faut associer un objet identifier au type
    http://download.oracle.com/docs/cd/B.../obj_types.htm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    DECLARE
    l_statement   VARCHAR2(30000);
    l_oid         VARCHAR2(240);
     
    BEGIN
    SELECT SYS_OP_GUID()
    INTO   l_oid
    FROM   sys.dual
    ;
     
    l_statement := '
    CREATE OR REPLACE TYPE data1 OID '''||l_oid||''' AS OBJECT
    (d1        VARCHAR2(10)
    ,d2        VARCHAR2(10))'
    ;
     
    EXECUTE IMMEDIATE l_statement ;
     
    END;
    /
     
    DESCRIBE data1@BDL_B_VERS_A

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par plabrevo Voir le message
    Il faut associer un objet identifier au type
    ...
    Avez vous essayez de le transmettre comme paramètre dans une procédure avec appel distant ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    J’ai fait quelques tests effectivement l’utilisation des types utilisateurs ( ici DATA1 ) n’est pas utilisable comme paramètres de procédure dans le cas d’utilisation de DBLink. Même en utilisant l’option OID.
    Apparemment cette option ne servirait que dans le cadre des import/export et de query distribué !!

    Dans mon cas j’ai fait un exemple avec DATA1 qui est une structure simple, mais en réalité le type est beaucoup plus complexe ( 30 champs en entête et un tableau avec une structure également de 40 champs ).
    Nous sommes à l’ère de la programmation Objet il me semble. Oracle no 1 mondial en parle aussi…

    Alors quelque aurait-il une idée pour passer des paramètres complexes, similaires aux types utilisateurs, dans le cas d’une architecture avec plusieurs bases de données ?

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par whenti Voir le message
    ...
    Alors quelque aurait-il une idée pour passer des paramètres complexes, similaires aux types utilisateurs, dans le cas d’une architecture avec plusieurs bases de données ?
    Ca devrait aller en utilisant un package pour définir le type complexe. Bref, ce n’est pas tout à fait la même chose que l’utilisation des types utilisateur mais, parfois ça peut suffire.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Ca devrait aller en utilisant un package pour définir le type complexe
    Pensais-tu à créer les dans les packages ou à autres choses ?

    Le problème c'est que je veux executer ses procédure de manières dynamiques puisque je peux avoir N serveurs.

    La seule solution que je voie c'est de passer par des tables temporaires ayant la même structure que les types. De faire des INSERT de manières dynamiques mais en détaillant chaque champs ( puisqu'on ne peut pas non plus utiliser de 'type utilisateur' lors des opérations INSERT en multi-bases ).
    Puis d'exécuter une procédure qui lit la table temporaire.

    En attendant qu'ORACLE développe cette fonctionnalité... peut-être qu'elle existe déjà en version 11G ?

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Oui en gros c’est ça.
    Pourriez-toi mettre un petit exemple complet de ce que t’essaie d’accomplir (deux bases, création des users, création du database link, tables, package, données, résultat attendu, etc.)

Discussions similaires

  1. [1.x] Exécuter une procédure stockée avec l'ORM propel
    Par megaloplex dans le forum Symfony
    Réponses: 8
    Dernier message: 31/07/2010, 13h47
  2. [AC-2000] Exécuter une procédure Sub avec une macro
    Par woant dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/06/2009, 12h22
  3. Exécuter un programme distant avec un trigger
    Par Stef784ever dans le forum SQL
    Réponses: 2
    Dernier message: 24/10/2008, 10h26
  4. Procédure stocké avec un ORDER BY paramétrable
    Par Erakis dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 10/11/2005, 14h12
  5. Procédure stockée avec serveur lié et paramètres
    Par AITOZ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2005, 17h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo