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 :

PL/SQL : Clause IN dynamique


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut PL/SQL : Clause IN dynamique
    Bonjour,

    Comment peut-on créer une clause IN dynamique dans un curseur? J'ai essayé plusieurs méthodes dont celle-ci :

    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
    DECLARE
    	FIC_TYPE_MAJ_LINE_2 VARCHAR2(4000);
     
    	CURSOR MON_CURSEUR(LISTE_JOBS_STATUTS VARCHAR2) IS 
    		SELECT TABLE_1.CHAMP_1, TABLE_1.CHAMP_2 , TABLE_1.CHAMP_3
    		FROM TABLE_1
    		WHERE
    		TABLE_1 . JOB_STATUS IN (LISTE_JOBS_STATUTS)
    		AND
    		(TABLE_1.CHAMP_1 = 'A' OR TABLE_1.CHAMP_1 = 'B');
    BEGIN
    	FIC_TYPE_MAJ_LINE_2 := '''C'',''D'',''E''' -- cette variable est récupéré en fait d'un fichier et ne peut pas être modifié
    	IF NOT LISTE_JOB%ISOPEN THEN
    		OPEN LISTE_JOB(FIC_TYPE_MAJ_LINE_2);
    	END IF; 
    END;

    Si vous avez besoin de précision n'hésitez pas. Je compte sur vous .
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    En passant par une table temporaire au lieu du IN par exemple

    - Mettre les valeurs désirées dans une GTT
    - Construire la clause IN à l'aide de la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO My_Gtt VALUES (122);
    INSERT INTO My_Gtt VALUES (666);
    [..]
     
    SELECT Champs
    [..]
    WHERE  TABLE_1.JOB_STATUS IN 
      (SELECT My_Value
      FROM  My_Gtt)
    [..]

  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 mieux, utiliser un ref_cursor !

    https://forums.oracle.com/forums/thr...readID=1049378

  4. #4
    Expert confirmé 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
    Par défaut
    Plusieurs solutions sont disponibles, ex: Varying in lists...

    Voilà une autre
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> CREATE OR REPLACE Procedure t_list_in
      2  Is
      3    l_var   sys.odcivarchar2list :=  sys.odcivarchar2list('Administration', 'IT');
      4  Begin
      5    For rec In (Select e.department_id, e.first_name
      6                  From hr.employees e
      7                       Join
      8                       hr.departments d
      9                    On d.department_id = e.department_id
     10                 Where d.department_name In (Select column_value
     11                                               from table(l_var)
     12                                            )
     13                 )
     14    Loop
     15      Dbms_Output.put_line(rec.first_name);
     16    End Loop;
     17  End;
     18  /
     
    Procedure created
    SQL> set serveroutput on
    SQL> exec t_list_in
     
    Jennifer
    Alexander
    Bruce
    David
    Valli
    Diana
     
    PL/SQL procedure successfully completed
     
    SQL>

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Juste avec INSTR, beaucoup plus simple si la chaine est bien formée.
    le rajout des ',' avant et après permet d'éviter que AA resorte sur une recherche de A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM (
    	SELECT CHR(64+ROWNUM) AS car FROM all_tables WHERE ROWNUM < 27
    	)
    WHERE INSTR(','||'''C'',''D'',''E'''||',', ','''|| car ||''',') > 0
     
    CAR
    C
    D
    E

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par McM Voir le message
    Juste avec INSTR, beaucoup plus simple si la chaine est bien formée.
    Beaucoup plus simple ????
    Beaucoup moins lisible surtout.

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

    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
    Billets dans le blog
    4
    Par défaut
    Oui plus simple, aucune transformation de la variable récupérée dans le fichier, et juste une ligne de code..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSTR(','||LISTE_JOBS_STATUTS||',', ','''|| TABLE_1.JOB_STATUS||''',') > 0
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TABLE_1.JOB_STATUS IN (LISTE_JOBS_STATUTS)
    Une ligne de commentaire pour expliquer au cas où le développeur serait débutant.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut Merci
    Bonjour,

    Merci à tous pour votre aide dans la résolution de mon problème. Un grand merci à McM qui a suit trouver la solution la plus simple. J'ai pu l'implémenté facilement, et cela fonctionne parfaitement.

Discussions similaires

  1. [Linq to SQL] Clause Where dynamique
    Par Kamishu dans le forum Accès aux données
    Réponses: 2
    Dernier message: 14/08/2008, 14h17
  2. [LINQ To SQL] Clauses WHERE dynamiques
    Par SaumonAgile dans le forum Accès aux données
    Réponses: 7
    Dernier message: 23/02/2008, 01h11
  3. [SQL] Clause Having
    Par Lou Pitchoun dans le forum Access
    Réponses: 2
    Dernier message: 20/10/2005, 14h03
  4. Réponses: 5
    Dernier message: 09/08/2005, 17h38
  5. [SQL*Plus] génération dynamique du fichier de spool
    Par lalystar dans le forum Oracle
    Réponses: 3
    Dernier message: 06/12/2004, 10h44

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