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 :

probléme avec les curseurs


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Points : 118
    Points
    118
    Par défaut probléme avec les curseurs
    Salut
    J'ai un problème avec les curseurs lorsque la condition utilise le comparateurIN
    voici la déclaration de mon curseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cursor crs(where_st VARCHAR2) is SELECT lib_doc from document where typ_doc in  where_st;
    voici le code utilisé pour appeler le curseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var_where_stm:='(''liv'',''cd'')';
    DBMS_OUTPUT.PUT_LINE('var_where_stm='||var_where_stm);
    FOR V_STR IN crs(var_where_stm) 
        LOOP   
           DBMS_OUTPUT.PUT_LINE('resultat='||V_STR.lib_doc);
        end loop;
    La chose bizarre est que la valeur var_where_stm affiché est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_where_stm=('liv','cd')
    et lorsque je remplace le parametre where_st dans la déclaration du curseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cursor crs(where_st VARCHAR2) is SELECT lib_doc from document where typ_doc in  ('liv','cd');
    le curseur dans ce cas fonctionne bien!!

  2. #2
    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

  3. #3
    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
    Sinon en PL/SQL tu peux utiliser un ref cursor.

  4. #4
    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 plaineR Voir le message
    Sinon en PL/SQL tu peux utiliser un ref cursor.
    Et comment un ref cursor peut aider dans ce cas ?

  5. #5
    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
    sinon du INSTR avec un formatage différent du var_where_stm
    Petite restriction, le séparateur "," ne doit pas exister dans la colonne (facilement contournable en mettant un chr(1) )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var_where_stm := 'liv,cd';
    CURSOR crs(where_st VARCHAR2) IS 
    SELECT lib_doc 
    FROM DOCUMENT 
    WHERE INSTR(','|| var_where_stm ||',',  ','|| typ_doc ||',') > 0

  6. #6
    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
    Citation Envoyé par mnitu Voir le message
    Et comment un ref cursor peut aider dans ce cas ?
    Comme cela :
    http://www.developpez.net/forums/d14...in/#post948157

  7. #7
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Points : 118
    Points
    118
    Par défaut
    Merci pour vos aides.
    Je veut bien essayer et vous informer ensuite du resultat

  8. #8
    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
    Votre exemple montre comment employer le SQL Dynamique et les variables curseur (ref cursor) y sont pour rien.

  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 McM Voir le message
    sinon du INSTR avec un formatage différent du var_where_stm
    Petite restriction, le séparateur "," ne doit pas exister dans la colonne (facilement contournable en mettant un chr(1) )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var_where_stm := 'liv,cd';
    CURSOR crs(where_st VARCHAR2) IS 
    SELECT lib_doc 
    FROM DOCUMENT 
    WHERE INSTR(','|| var_where_stm ||',',  ','|| typ_doc ||',') > 0
    @McM
    Votre exemple ne peut pas fonctionner tel que vous l'avez exemplifié.

  10. #10
    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
    Citation Envoyé par mnitu Voir le message
    Votre exemple montre comment employer le SQL Dynamique et les variables curseur (ref cursor) y sont pour rien.
    Sauf qu'on déclare et utilise un ref cursor...
    Après si ça vous amuse de démonter les réponses des uns et des autres...

    Personnellement, étant donné qu'il utilise un curseur, j'utiliserai plutôt ma solution que la votre qui même si elle est intéressante dans le cas du sql pur, a l'inconvénient d'être moins lisible et donc moins maintenable.

  11. #11
    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
    Citation Envoyé par mnitu Voir le message
    @McM
    Votre exemple ne peut pas fonctionner tel que vous l'avez exemplifié.
    Ah bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL>select * from all_users where instr(','||'SYS,SYSTEM'||',', ','||username||',')>0;
     
    USERNAME                          USER_ID CREATED
    ------------------------------ ---------- --------
    SYS                                     0 03/09/09
    SYSTEM                                  5 03/09/09

  12. #12
    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 plaineR Voir le message
    Sauf qu'on déclare et utilise un ref cursor...
    Après si ça vous amuse de démonter les réponses des uns et des autres...

    Personnellement, étant donné qu'il utilise un curseur, j'utiliserai plutôt ma solution que la votre qui même si elle est intéressante dans le cas du sql pur, a l'inconvénient d'être moins lisible et donc moins maintenable.
    Je pense que voue devez lire What Are Cursor Variables (REF CURSORs)?.
    Vous allez voir que l'utilisation d'une variable curseur (ref cursor) n'implique nulle part l'utilisation du SQL Dynamique.

    Il est possible de résoudre ce problème en SQL Dynamique mais ça a un coût supplémentaire lié au fait que chaque requête ainsi constitué est unique ce qui implique le hard parsing, etc. C'est à voir si c'est acceptable ou pas.

    Le code proposé par McM ne marche pas tel quel. Et pour le faire fonctionner il faut toujours employer du SQL Dynamique, et dans ce cas ...

  13. #13
    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
    Citation Envoyé par mnitu Voir le message
    Le code proposé par McM ne marche pas tel quel. Et pour le faire fonctionner il faut toujours employer du SQL Dynamique, et dans ce cas ...
    Ben non ! C'est justement le but de ce code, ne pas passer par du dynamique !!

    PlaineR te l'a démontré en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL>select * FROM all_users WHERE instr(','||'SYS,SYSTEM'||',', ','||username||',')>0;
     
    USERNAME                          USER_ID CREATED
    ------------------------------ ---------- --------
    SYS                                     0 03/09/09
    SYSTEM                                  5 03/09/09

  14. #14
    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
    Citation Envoyé par mnitu Voir le message
    Je pense que voue devez lire What Are Cursor Variables (REF CURSORs)?.
    Vous allez voir que l'utilisation d'une variable curseur (ref cursor) n'implique nulle part l'utilisation du SQL Dynamique.
    Je n'ai pas prétendu que l'utilisation de ref cursor implique du SQL dynamique, pas plus que le SQL Dynamique implique l'utilisation de ref cursor.

    Néanmoins, l'exemple que j'ai fourni utilise un ref cursor avec du sql dynamique, comme quoi l'un peut aussi aller avec l'autre...

  15. #15
    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 McM Voir le message
    Ben non ! C'est justement le but de ce code, ne pas passer par du dynamique !!

    PlaineR te l'a démontré en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL>select * FROM all_users WHERE instr(','||'SYS,SYSTEM'||',', ','||username||',')>0;
     
    USERNAME                          USER_ID CREATED
    ------------------------------ ---------- --------
    SYS                                     0 03/09/09
    SYSTEM                                  5 03/09/09
    Tu veux dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    variable txt varchar2(25)
    exec :txt := 'SYS,SYSTEM'
    Select * From all_users WHERE instr(','||:txt||',', ','||username||',')>0
    /
    Oui, c'est une solution qui n'utilise pas le SQL Dynamique. Mais j'ai peur qu'il ne lui reste que le full table scan comme méthode d'accès.

Discussions similaires

  1. probléme avec les curseurs explicites dynamiques
    Par madina dans le forum PL/SQL
    Réponses: 3
    Dernier message: 06/08/2010, 13h45
  2. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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