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:
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.
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 );
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éé:
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.
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;
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.
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.
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;
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.
Partager