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 :

comment retourner un set de donnée a partir d'une fonction


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 43
    Points
    43
    Par défaut comment retourner un set de donnée a partir d'une fonction
    Bonjour,
    je débute en PL/SQL et je voudrais arriver a faire une fonction qui me retourne un set de donnée exploitable dans une clause in comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from emp where champ1 in (ma_fonction('toto'))
    je fais des recherches et j'ai la très bonne brique oracle pl/sql d'o'reilly devant les yeux mais j'aurai besoin de savoir vers quoi je devrais me diriger, d'après ce que j'ai pu commencer a comprendre je pourrais utiliser les collections ou les pipe row, n'y a t'il pas moyen d'utiliser un ref cursor ou autre?

    merci de votre aide

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Il me semble que ce n'est pas un "set de données" dont tu as besoin, mais d'une chaine de caractères, tout simplement, non ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    la fonction devrait retourner une liste de number, set de donnée n'est peut-etre pas le terme exact c'est vrai, en fait la fonction devrait pouvoir retourner le résultat d'un select d'une colonne.

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Si tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ...
    FROM ...
    WHERE Machin in (2, 3, 7, 12)
    Tu as besoin d'une fonction qui te ramène '2, 3, 7, 12'.

    (Je ne peux pas tester...)

    Question subsidiaire, dans quel contexte vas-tu exécuter le SELECT (frontend interactif, programme, ...) ?

    Tu peux aussi regarder les fonctions PIPELINED :
    http://www.developpez.net/forums/vie...ight=pipelined
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    oui c'est ca la fonction devrait pouvoir me ramener les éléments qui interviendront dans le IN

    je travaille essentiellement dans un environnement de reporting, cognos reportnet, donc je n'ai que très de pouvoir sur la syntaxe du sql généré, c'est pour cela qu'il me faudrait une fonction qui ne nécéssite pas de syntaxe particulière.

    je viens de tester le pipelined, le souci est qu'il nécéssite d'être précédé par un TABLE(...), que je ne peux pas insérer dans le logiciel, du coup il me retourne une erreur vu qu'il essaye de comparer un number avec un type de donnée table :/

  6. #6
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Tu peux essayer cette méthode :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #1 
    SQL> REM instead of putting a type in a spec, do this: 
    SQL> 
    SQL> create or replace type myTableType as table of number; 
      2  / 
     
     
    Type created. 
     
     
    SQL> 
    SQL> REM here is an example of selecting from a local variable that is a pl/sql 
    SQL> REM table filled in at run time. 
    SQL> 
    SQL> declare 
      2      l_x    myTableType := myTableType( 1, 2, 3, 4, 5, 6, 7, 8, 9 ); 
      3   
      3  begin 
      4      for x in ( select * 
      5                   from all_users 
      6                  where user_id in 
      7                  ( select * 
      8                      from THE ( select cast( l_x as mytableType ) 
      9                                   from dual ) a ) ) 
     10      loop 
     11          dbms_output.put_line( x.username ); 
     12      end loop; 
     13  end; 
     14  / 
    SYSTEM 
     
     
    PL/SQL procedure successfully completed. 
     
     
    SQL> 
    SQL> REM now, we want to "select * from PLSQL_FUNCTION()" not from a table: 
    SQL> REM this shows how to 'insert into VAR select' as well... 
    SQL> 
    SQL> create or replace function getMyTableType return myTableType 
      2  as 
      3      l_x    myTableType; 
      4  begin 
      5          select cast( multiset( select user_id from all_users where rownum < 
    10 ) 
      6                                   AS myTableType ) 
      7            into l_x 
      8            from dual; 
      9   
      9      return l_x; 
     10  end; 
     11  / 
     
     
    Function created. 
     
     
    SQL> 
    SQL> 
    SQL> REM here we go... selecting from it: 
    SQL> 
    SQL> select * from all_users where user_id in 
      2  ( select * 
      3    from THE ( select cast( getMyTableType() as mytableType ) 
      4                         from dual ) a 
      5  ) 
      6  /

    Cf. http://groups.google.fr/group/comp.d...effd82bcafa0eb


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

Discussions similaires

  1. [AC-2010] Comment ouvrir une base de données access à partir d'une autre
    Par morobaboumar dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/03/2020, 22h05
  2. [Débutant] Comment construire un set de donnée?
    Par bilou_12 dans le forum C#
    Réponses: 10
    Dernier message: 15/01/2012, 16h17
  3. Réponses: 1
    Dernier message: 31/07/2009, 08h12
  4. Réponses: 0
    Dernier message: 10/02/2009, 09h49
  5. Réponses: 4
    Dernier message: 04/11/2008, 10h39

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