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

SQL Oracle Discussion :

Variable curseur et nom de champs en string ? HLP


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 55
    Points : 35
    Points
    35
    Par défaut Variable curseur et nom de champs en string ? HLP
    Salut !

    Je me retrouve confronté à un problème complexe :
    Dans une procédure stockée dans un package, je fais une boucle FOR ... LOOP sur un curseur implicite.
    Hors dans cette procédure je ne connais pas à l'avance ni le nom de la table, ni celui des champs de cette table. Ils sont tous passé en paramètres en entrée de la procédure.

    Le problème est qu'au moment où je souhaite utiliser ma variable curseur pour lire des valeurs de tel ou tel champ de ma table, le nom du champ se trouve dans une variable VARCHAR2.
    Hors celà provoque une erreur à la compilation de mon package, qui me signale que j'utilise un identificateur non valide à la suite de ma variable curseur.

    Pour faciliter la compréhension voici un petit schéma en pseudo code :

    PROCEDURE ma_proc (ma_Table IN VARCHAR2, mon_Champ IN VARCHAR2) IS
    DECLARE
    section déclarative
    BEGIN
    ici je crée une vue ma_Vue a partir de ma_Table;
    For c_rec IN (select * from ma_Vue) LOOP
    Select count(*) from ma_Table where c_rec.mon_Champ = ... ;
    END LOOP;
    END;

    J'ai essayé de mettre le nom de mon champ directement avec le paramètre IN (comme dans l'exemple), de le mettre dans une variable VARCHAR2, d'éxecuter mon Select en SQL dynamique natif (mais on ne peut visiblement pas utiliser les curseurs comme celà)...
    Là je sèche vraiment et je serais bien aise de bénéficier de votre expérience !

    Merci!

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut


    Tu vas être obligé de passer par du dynamique et par du FETCH, pas par du FOR LOOP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OPEN r FOR 'select '|| p_col ||' from ' || p_vue)
    LOOP
    FETCH...
    END LOOP;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    Donc je suis obligé d'ouvrir 1 curseur par champ ?

    C'est assez pénible de devoir tout gérer en manuel, si en plus il faut faire un curseur pour chaque champ

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Non heureusement, sinon bonjour les temps de réponse...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OPEN r FOR 'select '|| p_col1 || ',' || p_col2 ||' from ' || p_vue)
    LOOP
    FETCH r into v_col1, v_col2 ....
    END LOOP;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    En effet merci !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    J'ai bien compris le principe à appliquer, par contre je ne saisi pas la syntaxe :

    Est-ce que je dois déclarer le curseur dans la section déclarative ?
    Si oui comment (comme un curseur bidon que je vais réaffecter lors de son ouverture peut-être) ?

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ben non, le curseur c'est le 'select ...'
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    D'accord c'est bien ce que je pensais mais la syntaxe que vous avez donné est certainement incomplète ou erronée car je n'arrive pas à compiler avec.

    Le compilateur me dit que r n'est pas déclaré.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    J'ai trouvé le problème.
    Il faut en effet déclarer une variable de type REF CURSOR dans la section déclarative.
    Ensuite ça marche comme prévu.

    Merci pour votre aide !

Discussions similaires

  1. Variable dans les noms de champs
    Par Pieck dans le forum iReport
    Réponses: 0
    Dernier message: 26/02/2009, 18h23
  2. Pb : requete avec nom de champ variable renvoie le nom du champ
    Par Illecebrum dans le forum Développement
    Réponses: 3
    Dernier message: 08/12/2008, 19h17
  3. Variable dans un nom de champ
    Par zorgov dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/12/2008, 21h12
  4. Réponses: 15
    Dernier message: 18/11/2008, 15h47
  5. [PL/SQL) Curseur et nom de champ explicite
    Par Loko dans le forum Oracle
    Réponses: 6
    Dernier message: 01/12/2004, 15h07

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