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 :

FUNCTION PIPELINED RETURN SET OF ROWS


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut FUNCTION PIPELINED RETURN SET OF ROWS
    Bonjour,
    Je souhait écrire une fonction qui me retourne une table d'un type que j'ai défini moi même.
    j'ai cette erreur
    PLS-00302: le composant 'ID_GR' doit être déclaré.
    PLS-00328: expression du mauvais type
    ou ID_GR est la première colonne de mon type 'data_groupe'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TYPE data_groupe AS OBJECT
    (
        id_gr NUMBER,
        lib_gr VARCHAR2(50),
        id_descri NUMBER,
        lib_descri VARCHAR2(50),
        id_br NUMBER,
        seuil_br DOUBLE PRECISION
        );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TYPE table_data_groupe AS TABLE OF data_groupe;
    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
    CREATE OR REPLACE FUNCTION get_data_groupe (id_prod IN NUMBER)
       RETURN table_data_groupe
       PIPELINED
    IS
     
       out_rec    table_data_groupe
                     := table_data_groupe (NULL,
                                           NULL,
                                           NULL,
                                           NULL,
                                           NULL,
                                           NULL);
        CURSOR l_cursor IS
            SELECT g.id as id_gr,
                   g.libelle as lib_gr,
                   d.id as id_descri,
                   d.nom as lib_descri,
                   b.id as id_br,
                   b.seuil_bareme as seuil_br
              FROM pnp_fournisseur f,
                   pnp_entrepot e,
                   pnp_produit p,
                   pnp_composition_groupe cg,
                   pnp_groupe g,
                   pnp_groupe_descripteur gd,
                   pnp_descripteur d,
                   pnp_descripteur_bareme db,
                   pnp_bareme b
             WHERE     p.id = id_prod
                   AND f.id = cg.id_fournisseur
                   AND e.id = cg.id_entrepot
                   AND p.id = cg.id_produit
                   AND cg.id_groupe = g.id
                   AND g.id = gd.id_groupe
                   AND gd.id_descripteur = d.id
                   AND d.id = db.id_descripteur
                   AND db.id_bareme = b.id;                                   
    BEGIN
       OPEN l_cursor;        
          LOOP
            FETCH l_cursor INTO
     
                out_rec.id_gr, 
                out_rec.lib_gr,
                out_rec.id_descri,
                out_rec.lib_descri,
                out_rec.id_br,
                out_rec.seuil_br;       
            EXIT WHEN l_cursor%NOTFOUND;
            PIPE ROW(out_rec);
        END LOOP;
     
    CLOSE l_cursor;
    RETURN;
    END;

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Bonjour,

    Voici 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    DROP FUNCTION func_pipelined_test;
    DROP TYPE array_record_test;
    DROP TYPE record_test;
     
    CREATE TYPE record_test AS OBJECT ( ID_REC NUMBER
                                       ,VALUE_REC VARCHAR2(50)
                                      );
     
    CREATE TYPE array_record_test AS TABLE OF record_test;
     
    CREATE OR REPLACE FUNCTION func_pipelined_test 
    RETURN array_record_test PIPELINED
    IS
     
    out_record_test array_record_test := array_record_test() ;
     
    CURSOR cur_test
    IS
           SELECT 1 AS ID_REC,'value 1' AS VALUE_REC FROM DUAL UNION ALL
           SELECT 2,'value 2' FROM DUAL UNION ALL
           SELECT 3,'value 3' FROM DUAL
    ;
     
    TYPE array_test IS TABLE OF cur_test%ROWTYPE INDEX BY BINARY_INTEGER;
     
    in_record_test array_test;
     
    BEGIN
     
      OPEN cur_test;
      LOOP
         FETCH cur_test BULK COLLECT INTO in_record_test;              
           FOR i IN 1 .. in_record_test.COUNT
           LOOP                                    
               out_record_test.EXTEND;                        
               out_record_test(out_record_test.last) := record_test(in_record_test(i).ID_REC
                                                                    ,in_record_test(i).VALUE_REC);             
               PIPE ROW(out_record_test(out_record_test.last));
           END LOOP;       
         EXIT WHEN cur_test%NOTFOUND;
      END LOOP;
      CLOSE cur_test;
     
    RETURN;
    EXCEPTION
           WHEN OTHERS THEN
           IF cur_test%ISOPEN THEN
              CLOSE cur_test;
           END IF;       
           RETURN;
    END;
     
     
    select * from TABLE(func_pipelined_test);

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    ligne 7, c'est le record qu'il faudrait initialiser.

    Sinon, préfère les FOR LOOP, plus simples à coder/debuguer.
    J'utilise les fonctions pipelined comme ceci :
    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
    CREATE OR REPLACE FUNCTION get_data_groupe (id_prod IN NUMBER)
       RETURN table_data_groupe
       PIPELINED
    IS
        CURSOR l_cursor IS
            SELECT g.ID AS id_gr, g.libelle AS lib_gr,
            				d.ID AS id_descri, d.nom AS lib_descri, 
                   b.ID AS id_br, b.seuil_bareme AS seuil_br
            FROM pnp_fournisseur f,
                   pnp_entrepot e,
                   pnp_produit p,
                   pnp_composition_groupe cg,
                   pnp_groupe g,
                   pnp_groupe_descripteur gd,
                   pnp_descripteur d,
                   pnp_descripteur_bareme db,
                   pnp_bareme b
             WHERE     p.ID = id_prod
                   AND f.ID = cg.id_fournisseur
                   AND e.ID = cg.id_entrepot
                   AND p.ID = cg.id_produit
                   AND cg.id_groupe = g.ID
                   AND g.ID = gd.id_groupe
                   AND gd.id_descripteur = d.ID
                   AND d.ID = db.id_descripteur
                   AND db.id_bareme = b.ID;                                   
    BEGIN
       FOR r IN l_cursor;        
       LOOP
          PIPE ROW( DATA_GROUPE(r.id_gr, r.lib_gr, r.id_descri, r.lib_descri, r.id_br, r.seuil_br);
       END LOOP;
     	RETURN;
    END;

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Bonjour,
    Merci pour vos réponses. J'ai opté pour la solution de McM.

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

Discussions similaires

  1. public function __toString() { return $this->toto; }
    Par aitiahcene dans le forum Doctrine2
    Réponses: 5
    Dernier message: 21/05/2012, 18h55
  2. Problème function must return type "trigger"
    Par pony99 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/01/2012, 15h58
  3. Réponses: 0
    Dernier message: 21/01/2010, 16h09
  4. Function sans Return
    Par Danyel dans le forum VB.NET
    Réponses: 5
    Dernier message: 02/05/2008, 17h10
  5. [VB]Erreur: Function must return variant
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/02/2006, 12h23

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