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 :

SQL, variables et chaîne de caractères pour clause IN


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    691
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 691
    Points : 504
    Points
    504
    Par défaut SQL, variables et chaîne de caractères pour clause IN
    Hello à tous,

    J'ai lu dans le forum pas mal de topic sur des tableaux dans les clauses IN, etc... mais ça ne correspond pas trop à ce que je cherche (je pense). J'ai l'impression que la solution est assez simple mais je tourne autour du pot.

    J'ai une PROC dont les requêtes font souvent appel à des IN, avec des listes de valeurs donc que j'aimerai mettre dans une variable pour facilement les modifier au besoin. Je précise que les valeurs ne sont pas des paramètres de la PROC. Lorsque je met 1 valeur dans ma variable, ça fonctionne. Avec deux valeurs la PROC tourne toujours mais le résultat final n'est pas correct.

    J'ai essayé beaucoup de chose, avec ou sans parenthèses, en escapant les quote, etc... sans succès.

    Donc ça ressemble à quelque chose comme :

    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
    CREATE OR REPLACE blabla is
     
    list1value varchar2(80);
    list2value varchar2(80);
     
    BEGIN
     
    list1value = 'a';
    list2value = xxxxxxx ; -- voir ci dessous
     
    INSERT INTO okok
    SELECT * 
    FROM blabla
    WHERE machinchose IN (list1value);
     
    INSERT INTO okok_bis
    SELECT * 
    FROM trucbidule
    WHERE machinchose IN (list2value);
    Sur le list2value, j'ai essayé des :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    list2value = 'b', 'c';
    list2value = ' ''b'', ''c'' ';
    list2value = ( 'b' || ',' || 'c' )
    Sans succès.

    Merci pour l'aide !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour

    Je ne connais pas la syntaxe pour ce faire, mais j'utilise des fois une entourloupe pour faire un select similaire :

    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
      x   VARCHAR2(20) := 'ax/gb/nt/';
    BEGIN
      FOR r IN (SELECT *
                FROM toto
                WHERE x like '%' || texte1 || '/%' ) LOOP
        DBMS_OUTPUT.put_line(r.texte1);
      END LOOP;
    END;
    /*
    Il a bien trouvé les 2 bons records dans la table toto
    PL/SQL block executed
    ax
    nt
    */
    Mettre un séparateur entre les valeurs et l'inclure dans le like.

    J'espère que cela peut t'aider

    Amitiés
    martin

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    691
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 691
    Points : 504
    Points
    504
    Par défaut
    Merci pour cette piste, mais je ne pense pas que ça colle. Si je dois faire des boucles dans mes dizaines de requêtes qui ont de nombreuses jointures, avec des listes de plusieurs dizaines de valeurs, je crains que ma proc passe de très longues minutes à s’exécuter.

    Il n'y a vraiment aucun moyen de simplement avoir une chaîne de caractères en variables, et de dire au IN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Prends ma chaine de caractére, et met tout après le IN
    ?


  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Re-bonjour

    Pas besoin de faire de boucle, ici j'en ai juste fait une pour montrer un exemple avec un dbms_output. Faut juste remplacer le in par le like.

    Amitiés
    Martin

  5. #5
    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
    Générer vos requête dynamiquement. Mais ça c'est pour tester pas pour mettre en production.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    691
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 691
    Points : 504
    Points
    504
    Par défaut
    Oh, je vois, et il faut inverser dans la requête le mon_champ_de_ma_table et la liste de valeurs !

    Au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO insert_dans_la_table
    SELECT * 
    FROM ma_table
    WHERE mon_champ_de_ma_table IN (list2value);
    Il faut partir sur du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO insert_dans_la_table
    SELECT * 
    FROM ma_table
    WHERE list2value LIKE '%' || mon_champ_de_ma_table || '/%';
    Effectivement, ça fonctionne. Par contre, je ne me souviens plus si ça impacte les performances d'inverser comme ça le champ de ma table et la liste de valeurs dans le LIKE ?

    Merci

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Exact. Pour les performance, pas testé, car je n'utilise cette syntaxe que très exceptionnellement.
    Bon amusement

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Moi j'utiliserais Varying in lists, avec la vue, et une déclaration : list2value = 'b,c';

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    691
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 691
    Points : 504
    Points
    504
    Par défaut
    Merci pour le lien ! Mais je suis pas sur de bien suivre son exemple là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from all_users where username in ( :bv1, :bv2, :bv3, … :bv10 );
    bv1, bv2, etc... ? Il ne mentionne nul part le contenu. bv1 contient une seule valeur ? bv2 une seule autre ? Pas sur de bien comprendre l’intérêt dans ce cas ^^

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il ne faut pas lire If you have a finite number of items in the in-list, mais If you are in 9iR2 and above

  11. #11
    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
    Utilisez des collections que vous initialisées (presque) comme la chaine des caractères.
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> set serveroutput on
    SQL> 
    SQL> declare
      2    tab varchar2_tt := varchar2_tt('10','20','30');
      3    l_cpt           pls_integer;
      4  begin
      5    Select count(*)
      6      Into l_cpt
      7      From emp e
      8     Where e.deptno In (Select column_value
      9                          From table(tab)
     10                       );
     11     dbms_output.put_line(l_cpt);
     12  end;
     13  /
     
    14
     
    PL/SQL procedure successfully completed
     
    SQL>

  12. #12
    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
    IN et paramètres en chaine de caractère : Voir ce post
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2009, 17h17
  2. [SQL] Tests de chaînes de caractères
    Par sempire dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2008, 23h04
  3. Problème de chaîne de caractères pour popup
    Par roxxxy dans le forum Langage
    Réponses: 6
    Dernier message: 19/03/2007, 18h18
  4. [SQL] Remplacement de chaîne de caractères
    Par squal29 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/08/2006, 00h49
  5. Réponses: 3
    Dernier message: 07/12/2005, 10h09

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