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 :

utilisation d'une liste dans une clause in d'une requête dynamique


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut utilisation d'une liste dans une clause in d'une requête dynamique
    bonjour,

    j'ai une fonction qui prend une liste et j'aimerais bien le passer dans mon clause in et ça me renvoie une erreur "PLS-00306: wrong number or types of arguments in call to '||'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --donc au départ je declare un nouveau type:
    create type paymentMode as table of number;
    /
    --puis je l'utilise
    create or replace maFonction(liste in paymentMode) return sys_refcursor is
    res sys_refcursor;
    begin
    requete :=' select * from maTable where maValeur in select column_value from table('|| liste ||');
    open res for requete;
    return res;
    end;
    toute aide sera la bienvenue.merci

  2. #2
    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
    Vous devez écrire une fonction qui prends en entrée une collection, voilà un exemple:
    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
     
    Connecté à :
    Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
    With the Real Application Testing option
     
    SQL> create type number_tt as table of number(6)
    /
      2
    Type créé.
     
    SQL> Create Or Replace Function foo (
      2    number_col      number_tt
      3  ) Return sys_refcursor Is
      4    rc sys_refcursor;
      5  Begin
      6    Open rc For
      7      Select ename
      8        from emp
      9       Where empno in (Select column_value
     10                         From table(number_col)
     11                      );
     12    Return rc;
     13  End;
     14  /
     
    Fonction créée.
     
    SQL> var rc refcursor
    SQL> exec :rc := foo(number_tt(7369, 7499))
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> print rc
     
    ENAME
    ----------
    SMITH
    ALLEN
    Il vous reste maintenant à ajouter le code nécessaire au chargement de la collection à partir de la chaine des caractères contenant les valeurs avant d'appeler la fonction.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Varying in lists

    [edit] : Ou solution proposée par Mnitu, et surtout évitez le sql dynamique.

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut
    merci à tous, en fait je suis obligée de passée par le sql dynamique car ceci est juste une partie de ma fonction et le paramètre qui est en liste est facultatif. Du coup je dois construire ma condition en fonction de sa nullité ou pas

  5. #5
    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
    Si il y a que ça vous pouvez vivre avec une fonction qui gère les deux cas
    • paramètre de type liste nul
    • paramètre de type liste non nul

    sans utiliser du sql dynamique.

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut
    en effet un "if" a suffit minitu merci et dsl

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/02/2014, 17h40
  2. Réponses: 1
    Dernier message: 09/01/2012, 16h47
  3. [AC-2007] retrouver une donnée dans la 2ième colone d'une liste
    Par johanaquatique dans le forum IHM
    Réponses: 12
    Dernier message: 04/06/2010, 14h45
  4. tri par rapport à une liste dans la clause where
    Par umbakrail dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/07/2006, 11h32
  5. Réponses: 17
    Dernier message: 12/07/2006, 22h04

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