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 :

Curseur & DBLink & Procedure


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut Curseur & DBLink & Procedure
    Bonjour tout le monde,

    Je ne connais pas du tout PL/SQL (enfin jusqu'à hier ).
    J'ai un truc à implémenter rapidement (comme d'hab), je plonge donc dedans....

    Je dois appeler une procédure stockée située sur une autre base. Cette procédure me retourne un ref cursor (ne sautez pas au plafond si j'emploie des termes de manière inappropriée, le PL/SQL et Oracle c'est tout nouveau pour moi !!)

    Donc je crée un dblink pour accéder à l'autre base, j'écris une petite procédure qui fait appel à la procédure distante, et bam je me prend une erreur 01001 "curseur non valide" dans la tête. Généralement j'ai vu que cette erreur est due à un curseur fermé - hors dans mon cas le curseur a déjà été ouvert dans la procédure distante.

    Voici mon code :

    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
    create or replace
    PROCEDURE testMe
    AS
     
    TYPE RET_CURSOR IS REF CURSOR;
    codeRetour INTEGER;
    curMedecins RET_CURSOR;
    curr_NOM CHAR(25) := NULL;
     
    BEGIN
    pkdistant.procDistante@DBLINK(codeRetour, curMedecins,'NOM');
    loop
        fetch curMedecins into curr_NOM;
        exit when curMedecins%notfound;
    /* du traitement ici */
      end loop;
    END;




    Précisions :
    - le troisième paramètre dans l'appel de la procédure distante permet de choisir les colonnes présentes dans le curseur de retour, dans mon cas seulement la colonne 'NOM' qui est déclarée dans le curseur en CHAR(25).
    - la procédure compile sans problème, c'est à l'exécution que ça pète.

    Et donc, la question : d'ou peut provenir mon erreur ? le DBLINK peut-il être mis en cause ? j'ai bien fait attention à déclarer un DBLINK public. Là franchement je nage...

    Toute aide serait la bienvenue.

    Merci d'avance,

    Mathieu.

  2. #2
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Tu n'ouvres a aucun moment ton curseur !
    (OPEN)

  3. #3
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Ou utilise plutot une boucle "curseur" (CURSOR FOR LOOP)
    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
    CREATE OR REPLACE
    PROCEDURE testMe
    AS
     TYPE RET_CURSOR IS REF CURSOR;
    codeRetour INTEGER;
    curMedecins RET_CURSOR;
    curr_NOM CHAR(25) := NULL;
     
    BEGIN
    pkdistant.procDistante@DBLINK(codeRetour, curMedecins,'NOM');
    FOR C1 IN curMedecins LOOP
        curr_NOM:= C1.NOM; -- <= Nom du champ dans le curseur
    /* du traitement ici */
    END LOOP;
    END testMe;

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut
    Selamat Pagi Garuda, terima kasi pour ta réponse !

    Citation Envoyé par Garuda Voir le message
    Tu n'ouvres a aucun moment ton curseur !
    (OPEN)
    Mon curseur est déjà ouvert dans la procédure que j'appelle.
    D'autre part, j'ai testé le bout de code que tu as envoyé mais j'ai les erreurs suivantes à la compilation de ma procédure :

    Error(18,1): PL/SQL: Statement ignored
    Error(18,11): PLS-00221: 'CURMEDECINS' n'est pas une procédure ou est indéfini

    La ligne 18 correspondant à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FOR c1 in curMedecins LOOP
    Mais bon dans tout les cas un mec dans la boîte ou je travaille s'est déjà heurté au problème... A priori impossible de faire transiter les REF CURSOR via un DB LINK. Ce qui est plutôt logique : un REF CURSOR est implémenté comme une sorte de pointeur vers une zone mémoire si j'ai bien compris, il est donc logique qu'il ne corresponde plus à rien une fois qu'on a changé de base...ou am I wrong ?

    Donc à moins que ma théorie ne soit fumeuse et que quelqu'un ne me contredise, j 'essaie de trouver un contournement !

  5. #5
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    je maitrise mieux le PL/SQL que le bahasa Indonesia !

    - Quelle est ta version d'oracle ?
    - Si tu googleise "ref_cursor db_link", tu auras beaucoup d'éléments !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut
    Citation Envoyé par Garuda Voir le message
    je maitrise mieux le PL/SQL que le bahasa Indonesia !
    je pensais vu ton pseudo

    Citation Envoyé par Garuda Voir le message
    - Quelle est ta version d'oracle ?
    Oracle v 10.1.0.5.0


    Effectivement j'ai trouvé pas mal de résultats sur google depuis, qui confirment que je vais devoir faire autrement !

    Merci pour ton aide.

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