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

Oracle Discussion :

[PL/SQL] SQL Dynamique et curseur


Sujet :

Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut [PL/SQL] SQL Dynamique et curseur
    Bonjour

    J'ai lu le tutoriel de Sheik Yerbouti sur le Sql dynamique, ainsi que les fils de ce forum que j'ai pu trouver sur la question, mais j'ai encore des zones pas tres claires dans ma tete.

    Mon but est surement simple et courant : un formulaire de recherche (sur 1 ou plusieurs champs de ma table) doit passer en parametre a ma procedure les valeurs des champs voulus, puis afficher les lignes correspondantes.

    Si je ne m'abuse, il faut que je teste pour chaque champ si une valeur de recherche a ete saisie, car si je fais tout betement un curseur avec des clauses "where champ = valeur" et que l'utilisateur n'a pas choisi ce critere la requete va me retourner que les enregistrements pour lesquels le champ est vide (alors que je ne veux en fait pas de restriction). Donc sql dynamique, en testant si valeur is not null pour chaque champ avant de le rajouter dans ma clause where.

    Avant de taper tout le code detaillé j'ai voulu commence par une version simple que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       PROCEDURE liste_personnes (p_id_site VARCHAR2, p_id_service VARCHAR2, p_id_dpt VARCHAR2)
       IS
          TYPE curseur_liste IS REF CURSOR;
          liste curseur_liste;        
       BEGIN
     
          open liste for  'select * from personne order by nom, prenom';
         for personne in liste loop
            htp.p('id : '||liste.id_personne);
         end loop;
    :

    Je ne comprends pas pourquoi j'ai une erreur de compilation "LISTE' is not a procedure or is undefined" sur la ligne "for ...".

    Merci
    Loko

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Est-ce vraiment nécessaire de passer par du PL SQL ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    oui, car tout mon environnement (portal) est basé sur mod_plsql, et je fais egalement plein d'autres choses dans cette proc (que je detaille pas ici pour mieux cerner le probleme).

    Donc, savez vous d'ou vient le probleme ?

  4. #4
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Si tu es sous 9i tu peux utiliser le type prédéfini SYS_REFCURSOR.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par lalystar
    Si tu es sous 9i tu peux utiliser le type prédéfini SYS_REFCURSOR.
    J'avais vu cela dans l'une de vos réponses a Cerberes, mais j'obtiens la meme erreur a la compilation ...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    J'ai remplacé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FOR personne IN liste loop
       htp.p('id : '||liste.id_personne);
    end loop;
    par un bon vieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    loop 
         fetch liste into l_id,l_prenom,l_nom;
       htp.p('id : '||liste.id_personne;
       exit when liste%NOTFOUND;
    end loop;
    et ca fonctionne. Ca veut donc dire que la syntaxe "FOR var IN curseur LOOP" fonctionne avec les curseurs explicites mais pas les Ref Cursors ???

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bizarre, je viens d'essayer, je n'ai pas de pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> create or replace procedure liste_personnes (p_id_site varchar2, p_id_service varchar2, p_id_dp
    t varchar2) 
      2  is 
      3     liste sys_refcursor;        
      4  begin 
      5     open liste for 'select * from personne order by nom, prenom'; 
      6  end;
      7  /
     
    Procedure created.
     
    SQL> show errors;
    No errors.

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    oui, mais ce n'est pas ce "for" là qui ne passe pas à la compilation, mais celui d'apres ! ( for personne in liste loop ... end loop.

  9. #9
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Oui j'avais mal lu. En tout cas ca ne m'étonne pas que ca ne marche pas : avec un ref cursor tu fais l'open tandis qu'avec un for... Oracle te fais l'open alors que toi tu as déjà fais l'open du ref cursor.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Vous ne pouvez pas faire à la fois

    et juste après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR var_cursor IN nom_curseur ...
    Vous essayez d'ouvrir 2 fois le même curseur !
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Ah pardon ! Je ne savais pas que le "for .. in " ouvrait implicitement le curseur. Autant pour moi.

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création Curseur à partir d'un sql statement dynamique
    Par droog dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 20/05/2008, 15h04
  2. Réponses: 10
    Dernier message: 04/10/2007, 14h17
  3. [PL/SQL] Traitement d'un curseur dans une fonction
    Par ruda.tom dans le forum Oracle
    Réponses: 1
    Dernier message: 24/10/2005, 22h06
  4. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  5. [PL/SQL] Procédure renvoyant un curseur.
    Par KalHadj-Nikov dans le forum Oracle
    Réponses: 3
    Dernier message: 17/12/2004, 15h10

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