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

SQL Oracle Discussion :

Création d'une fonction qui retourne plusieurs lignes


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut Création d'une fonction qui retourne plusieurs lignes
    je cherche a écrire une fonction oracle (8i) qui retourne plusieurs lignes.

    exemple :
    retourner l'ensemble des utilisateurs qui sont inscrit depuis plus de 6 mois

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Simple ta fonction devra retournée un type d'objet utilisateur de type table PL/SQL de record

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    merci pour ta reponse malheureusement j'ai pas tous suivi à ta reponse

    tu n'as pas un exemple que je comprenne en le lisant ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    En gros en suppposant que tu souhaites recupere toute les informations d'une table et que tu souhaites les passer à une autre fonction

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    --Tu veux renvoyer X fois les informations nom, et link
    -- Donc tu crées un record qui correspond aux 2 infos
    TYPE type_record IS RECORD(
          nom  VARCHAR2(50),
          link VARCHAR2(10000));
    -- Ensuite comme tu ne sais pas combien de ligne tu vas renvoyer tu crées une table PL/SQL de l'objet que tu as défini juste avant.
    TYPE type_table IS TABLE OF type_record INDEX BY BINARY_INTEGER;

    Maintenant ta fonction pourra renvoyer le nouvel objet défini dans les spécs du package comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FUNCTION test (...Args) RETURN type_table...
    Pour le remplir
    tu crées un objet de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    v_test type_table
    -- on le rempli
    FOR i in 1..10 LOOP
    v_test(i).nom:='NOM'||i;
    v_test(i).link:='LINK'||i;
    END LOOP;

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    tu peut utiliser la notion du curseur...

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Le mot "record" n'a pas l'air d'etre reconnu dans 8i ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    --Tu veux renvoyer X fois les informations nom, et link 
    -- Donc tu crées un record qui correspond aux 2 infos 
    TYPE type_record IS RECORD( 
          nom  VARCHAR2(50), 
          link VARCHAR2(10000)); 
    -- Ensuite comme tu ne sais pas combien de ligne tu vas renvoyer tu crées une table PL/SQL de l'objet que tu as défini juste avant. 
    TYPE type_table IS TABLE OF type_record INDEX BY BINARY_INTEGER;

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Si si
    c'est dans la docs officielles, par contre tu l'as peut etre pas déclaré au bon endroit.

    http://download-west.oracle.com/docs...colls.htm#7543

    C'est le lien vers la doc officielle

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    je suis désolé mais je n'arrive pas à rentrer dans la logique du fonctionnement.

    voici mon code qui me fait plein d'erreur :

    si vous pouvez continué à me guider merci

    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
     
    declare
       TYPE Definition IS RECORD ( word    VARCHAR2(20) );
       TYPE Dictionary IS TABLE OF Definition INDEX BY BINARY_INTEGER;
     
     
       FUNCTION montest RETURN Dictionary IS 
     
      	CURSOR recs_source IS 
        select name
        from dtree 
        connect by parentid = prior dataid 
        start with dataid = intpSource;
     
        bren Dictionary;
        monname varchar2(50);
        i integer;
     
        BEGIN 	 
     
              open recs_source; 		            		
              i :=0;
              LOOP
               		 FETCH recs_source INTO monname;
                   EXIT WHEN recs_source%NOTFOUND;  
     
                   bren(i).word := monname;
                   i:=i+1;
              END LOOP;
     
              CLOSE recs_source;
        end; 	
    begin
     
    end;

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Voici une version avec un bug en moi (mais ca ne fonctionne toujours pas )

    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
    declare
       TYPE Definition IS RECORD ( word    VARCHAR2(20) );
       TYPE Dictionary IS TABLE OF Definition INDEX BY BINARY_INTEGER;
     
     
       FUNCTION montest RETURN Dictionary IS 
     
      	CURSOR recs_source IS 
        select name
        from dtree;
     
        bren Dictionary;
        monname varchar2(50);
        i integer;
     
        BEGIN 	 
     
              open recs_source; 		            		
              i :=0;
              LOOP
               		 FETCH recs_source INTO monname;
                   EXIT WHEN recs_source%NOTFOUND;  
     
                   bren(i).word := monname;
                   i:=i+1;
              END LOOP;
     
              CLOSE recs_source;
        end; 	
    begin
     
    end;

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Oula

    OKi je te propose de faire cela dans un package pour simplifier le tout

    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
    CREATE OR REPLACE PACKAGE test IS
      TYPE definition IS RECORD(
        word VARCHAR2(20));
      TYPE dictionary IS TABLE OF definition INDEX BY BINARY_INTEGER;
      FUNCTION montest RETURN dictionary;
    END;
    /
     
    CREATE OR REPLACE PACKAGE BODY test IS
     
      FUNCTION montest RETURN dictionary IS
        CURSOR recs_source IS
          SELECT NAME
          FROM   dtree
          CONNECT BY parentid = PRIOR dataid
          START  WITH dataid = intpsource;
        bren    dictionary;
        monname VARCHAR2(50);
        i       INTEGER;
      BEGIN
        OPEN recs_source;
        i := 0;
        LOOP
          FETCH recs_source
            INTO monname;
          EXIT WHEN recs_source%NOTFOUND;
          bren(i) .word := monname;
          i := i + 1;
        END LOOP;
        CLOSE recs_source;
        RETURN recs_source;
      END;
     
    END;
    /
    Ensuite pour execute ta fonction
    il suffira de mettre dans to code PL/SQL appelant

    test.montest à la place de montest

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Si le record n'a qu'une seule colonne tu peux t'en passer :
    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
     
    declare
       TYPE Dictionary IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
     
     
       FUNCTION montest RETURN Dictionary IS 
     
      	CURSOR recs_source IS 
        select name
        from dtree 
        connect by parentid = prior dataid 
        start with dataid = intpSource;
     
        bren Dictionary;
        monname varchar2(50);
        i integer;
     
        BEGIN 	 
     
              open recs_source; 		            		
              i :=0;
              LOOP
               		 FETCH recs_source INTO monname;
                   EXIT WHEN recs_source%NOTFOUND;  
     
                   bren(i).word := monname;
                   i:=i+1;
              END LOOP;
     
              CLOSE recs_source;
        end; 	
    begin
     
    end;

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Tout d'abord, votre fonction ne retourne rien, ce qui est ennuyeux pour une fonction...

    Pour faire simple, une table composée de colonnes de type VARCHAR2(20) sera suffisante. Je ne vois pas l'interet d'un record composé d'un seul champs.

    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
    Declare
    TYPE MON_TYPE IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER ;
    table_rec MON_TYPE ;
    Function Ma_fonction ( ...... ) RETURN MON_TYPE IS
    Declare
       tab_rec MON_TYPE ;
    Begin
       OPEN C For 'Select ma_colonne From ma_table' ;
       FETCH C BULK COLLECT Into tab_rec ;
       CLOSE C ;
       RETURN tab_rec ;
    End ;
    ...
    Begin
      ....
      -- appel fonction --
      table_rec := Ma_fonction(...) .
      ....
    End ;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    C'est impecable, ca fonctionne merci à tous

    Un autre point :
    comment recuperer la structure de ma table ?
    Ce que je veux c'est executer un "select ...." qui me retourne x lignes, chaque ligne corespondant au nom d' une colonne de ma table

    merci

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    alors tu trouveras ton bonheurs dans les vues

    USER_TABLES et USER_TAB_COLUMNS

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    J'ai rien a dire a part merci pour la qualité et la rapidité des reponses

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

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. Réponses: 2
    Dernier message: 18/08/2009, 21h14
  3. Fonction d'une DLL qui retourne plusieur valeur
    Par vtk37 dans le forum Débuter
    Réponses: 9
    Dernier message: 27/05/2009, 10h01
  4. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43
  5. Réponses: 7
    Dernier message: 03/12/2004, 12h40

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