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;