Bonjour à tous.

Voilà, ça fait quelque temps que je fait du PL/SQL, et pourtant je suis toujours un gros nul la dedans.

Alors voilà mon problème, dans le cadre de mon cours de gestion de bases de données, je dois faire un site web (en utilisant les options oracle) qui va me permettre de gérer le site d'un construteur de cuisine équipée.

J'ai donc créé dans ma BD, plusieurs table à cet effet.

Je me retrouve donc avec les tables suivantes:

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
 
ELEMENTS(
ID_ELEMENT	            CHAR(15 BYTE)
DIM_HAUTEUR	    NUMBER(4,1)
DIM_LARGEUR	    NUMBER(4,1)
DIM_PROFONDEUR    NUMBER(4,1)
PRIX	                    NUMBER(6,2)
ID_PROJETCOMMANDE	VARCHAR2(25 BYTE)
ID_IMAGE	            NUMBER
CODE_COULEUR	    VARCHAR2(5 BYTE)
ID_MODULE	            VARCHAR2(15 BYTE)
ID_GABARIT	            VARCHAR2(15 BYTE)
CODE_TYPE	            VARCHAR2(10 BYTE)
ID_MODELE	            NUMBER
);
 
COULEUR(
CODE_COULEUR	VARCHAR2(5 BYTE)
DESCRIPTION	        CHAR(15 BYTE)
);
 
MODELES(
ID_MODELE	    NUMBER
DESCRIPTION	    VARCHAR2(50 BYTE)
);
 
IMAGES(
ID	NUMBER
NAME	VARCHAR2(50 BYTE)
MIME_TYPE	VARCHAR2(128 BYTE)
IMAGE	BFILE
IMAGEB	BLOB
);
Dans l'énoncé, il nous est demandé de réaliser une fonction de recherche (à réaliser par l'intermédiaire de procédure), permettant de choisir une série d'éléments en fonction de leur couleur et de leur modèle.

Pour ce faire, j'ai créé ma procédure, et j'ai également créé un record qui me permettra de récupérer seulement les données que je juge utile d'afficher sur ma page web.
Voici donc le RECORD que j'ai créé:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
TYPE myElement is RECORD(
filename varchar2(100),
id_element elements.id_element%type,
descrip_model modeles.description%type,
comp_dimension varchar2(20),
descrip_coul couleur.description%type,
prix elements.prix%type
);
 
type t_myElement is table of myElement;
Donc, lorsque je ferais appel à la procédure de recherche, elle prendre en paramètre, la couleur, le modèle, et une table de type t_myElement.

Maintenant, voici le problème proprement dit:

Lorsque je souhaite placer les éléments avec leurs données spécifiques utiles pour l'affichage, j'ai une erreur et je ne sais plus (pas) pourquoi. Je vous invite donc à jeter un oeil à mon code.

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
69
70
71
 
procedure getResultat(listcouleur in couleur.code_couleur%type, listmodele in modeles.id_modele%type, collectionElements out LKSite.t_myElement)
as
dir_alias varchar2(100);
filename varchar2(255);
 
laCouleur couleur.description%type;
leModele MODELES.description%type;
lImage IMAGES.image%type;
 
type t_Elements is table of ELEMENTS%rowtype;
tElements t_Elements;
 
begin
 
  begin
  SELECT COULEUR.description into lacouleur FROM COULEUR WHERE COULEUR.code_couleur = listcouleur;
  exception
    WHEN NO_DATA_FOUND THEN 
      err_pkg.report_and_go('cat_pkg.getResultats',-20001, 'Couleur non trouvée dans la base pour '|| listcouleur);
  end;
 
  begin
  SELECT MODELES.description into leModele FROM MODELES WHERE MODELES.id_modele = listmodele;
  exception
    WHEN NO_DATA_FOUND THEN
      err_pkg.report_and_go('cat_pkg.getResultat', -20001, 'Modele non trouvé dans la base pour '||listmodele);
  end;
 
  begin
    SELECT * BULK COLLECT INTO tElements FROM elements 
    WHERE code_couleur = listcouleur AND id_modele = listmodele;
  exception
    WHEN OTHERS THEN
    err_pkg.report_and_go('cat_pkg.getResultat', -20002, 'Erreur de Bulk Collect');
  end;
 
  begin
    for i in tElements.first..tElements.last
    loop
 
    begin
      collectionElements(i).id_element := tElements(i).id_element;
 
    EXCEPTION 
    WHEN OTHERS THEN
      err_pkg.report_and_go('cat_pkg.getResultat', -20019, 'ERREUR SUPER COMPLEXE DE PAS COOL PAS BIEN');
    end;
 
      collectionElements(i).prix := tElements(i).prix;
      collectionElements(i).comp_dimension := tElements(i).dim_hauteur||'*'||tElements(i).dim_largeur||'*'||tElements(i).dim_profondeur;
      collectionElements(i).descrip_coul := laCouleur;
      collectionElements(i).descrip_model := leModele;
 
      SELECT * into uneImage FROM IMAGES WHERE IMAGES.id = tElements(i).id_image;
 
      if uneImage.image is not null
      then
        dbms_lob.filegetname(uneImage.image, dir_alias, filename);
      else
        filename := 'images/catalogue/default.jpg';
      end if;
      collectionElements(i).filename := filename;
 
    end loop;
  EXCEPTION
    WHEN OTHERS THEN 
      err_pkg.report_and_go('cat_pkg.getResultat', -20003, 'Erreur lors du bouclage dans le package');
  end;
 
end getResultat;
La première selection que je réalise, vous l'aurez sans nulle doute compris, me sers à récupérer la description de la couleur (à savoir blanc, noir, jaune, ...), et la deuxième sélection me sers à récupérer le modèle.
Ensuite, je réalise un BULK COLLECT afin de récupérer l'ensemble des éléments dont la couleur et le modèle corredpondent à ceux passer en paramètres.
Mon problème se pose maintenant, c'est que je n'arrive pas à replacer ces valeurs des ma table temporaire à ma table de type personnalisé (qui servira de valeur de retour).

Quelqu'un pourrait-il me dire ce qui cloche lorsque je fait mon assignation de am table tElements vers am collectionElements, car il rentre dans la gestion de l'exception et me donne le code -20019?

En vous remerciant d'avance pour l'aide que vous pourrez m'apporter, je vous souhaite de passer une bonne fin de journée.

p.s.: Je sais que ce message est très très long à lire, et qu'il m'aurait été suffisant de taper quelques lignes, mais peut être le problème viendrait-il d'autre part, ou alors quelqu'un parmi vous aurait une idée afin d'optimiser tout cela.