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 :

[Oracle 9.1] Select et clause IN


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut [Oracle 9.1] Select et clause IN
    Bonjour,

    J'aimerais construire une requête dans un script PL/SQL sous la forme d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from TABLE where CHAMP in VARIABLE
    où ma variable serait une chaîne de caractère représentant une liste de valeurs.

    Quel est le meilleur moyen de faire ? L'usage du SQL dynamique est-il nécessaire ?

    Merci, Frédéric

  2. #2
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Bonjour,
    Voici ce que je fais dans une de mes procedures PL/SQL:

    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
    FUNCTION retrieveParcelles(listeIdsParcelle_ IN NUMBER_ARRAY, typeSaisie_ number) RETURN type_curseur IS
    		curseur type_curseur;
    		query VARCHAR2(1024);
    		text VARCHAR2(1024);
    	BEGIN
    			query := 'SELECT * FROM PARCELLE WHERE PARCELLE_ID in (';
     
    		for i in 1 .. listeIdsParcelle_.count loop
    	       if i = 1 then
    	            text := to_char(listeIdsParcelle_(i));
    	       else
    	            text := ','||to_char(listeIdsParcelle_(i));
    	       end if;
    	            query := CONCAT(query,text);
    	    end loop;
    		text :=')';
    		query := CONCAT(query,text);
     
    		OPEN curseur FOR query;
    		--La fonction retourne le resultat de la requete
    		return curseur;
     		----- Traite exception dans le cas d'un probleme quelconque -----
    		EXCEPTION
    			WHEN OTHERS THEN RAISE;
    	END retrieveParcelles;
    Le type NUMBER_ARRAY est déclaré comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create or replace type NUMBER_ARRAY as table of NUMBER;
    En esperant t'aider.
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  3. #3
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Merci, je vois bien

    Est-ce que ça fonctionne aussi avec un DELETE car en fait, c'est un DELETE que je dois faire ! Le curseur ne concerne qu'une interrogation et du coup je me demande comment lancer l'exécution d'une requête DELETE contenue dans une variable de type Varchar.

    Merci, Fred

  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
    Eh bien dans ce cas utilise execute immediate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin
    execute immediate 'delete from matable where macol in (' || mavariable || ');';
    end;
    /
    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
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Oui, il n'y a aucun problème:
    Construis ta requete SQL et ensuite utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EXECUTE IMMEDIATE query;
    --La fonction retourne le nombre de lignes modifiées.
    return SQL%ROWCOUNT;
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  6. #6
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    C'est du SQL dynamique ça n'est-ce pas ?

    Effectivement ça fonctionne bien ainsi... En fait, je pensais qu'il y avait une possibilité de s'en sortir en SQL statique...

    Merci !

  7. #7
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Oui il s'agit de SQL dynamiquemais je ne sais pas si il y a d'autre facon de faire. Si tu trouves une autre façon de faire, n'hésite pas à nous en faire part.
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE matable 
    WHERE INSTR(',' || mavariable || ',' , ',' || macol || ',') > 0
    Une condition à remplir pour mavariable : les champs doivent être uniquement séparés par des virgules, pas d'espace.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. Oracle 8i :Ordre Select dans la création de vue
    Par madina dans le forum Oracle
    Réponses: 2
    Dernier message: 05/06/2006, 12h24
  2. [Oracle 10g]INSERT SELECT lent
    Par Giill dans le forum Oracle
    Réponses: 2
    Dernier message: 22/05/2006, 17h18
  3. [Oracle] Dayname dans select
    Par Cupidon dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/05/2006, 14h03
  4. [Oracle 9] Requete selection top 5
    Par Le Mad dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/02/2006, 17h29
  5. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 15h28

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