Bonsoir à tous,

Je sèche sur un problème de compilation de ma procédure PL/SQL.
Je suis (hyper) débutant en PL/SQL, et ce n'est pas trop ma tasse de thé...

Donc voici le schéma de ma base :



Le but est de mettre à jour le champ nombrecaloriesconsommees (qui est une addition des calories absorbées par le dragon pour chaque produit) pour chaque dragon dans la table dragon. Ce nombre de calories est donc calculé via le la colonne quantité de la table repas et le nombre de calories de la table nourriture.

Donc j'ai fait une petite procédure que vous pourrez trouver ci-dessous.
Seulement pendant la compilation j'ai ces erreurs :



Avec mes maigres connaissances en PL/SQL et malgré mes recherches sur le Net je vois pas comment les résoudre.

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
CREATE OR REPLACE PROCEDURE update_nb_calories
IS
  CURSOR cursor_dragons IS SELECT dragon FROM dragons;
  CURSOR cursor_produits;
  un_dragon cursor_dragons%ROWTYPE;
  un_produit cursor_produits%ROWTYPE;
  nb_calories NUMBER:=0;
  tmp_calories NUMBER:=0;
  tmp_quantite NUMBER:=0;
BEGIN
  /* On fait une boucle pour mettre à jour chaque dragon */
  FOR un_dragon IN cursor_dragons
    LOOP
      cursor_produits:=SELECT produit FROM repas WHERE dragon = un_dragon.dragon;
 
      /* On fait une boucle pour récupérer les calories absorbées par le dragon courant */
      FOR un_produit IN cursor_produits
        LOOP
 
          tmp_calories:=SELECT calories FROM nourriture WHERE produit = un_produit.produit;
          nb_calories:=nb_calories+tmp_calories;
 
          tmp_quantite:=SELECT quantite FROM repas
            WHERE produit = un_produit.produit;
 
          nb_calories:=nb_calories*tmp_quantite;
 
          tmp_calories:=0; 
          tmp_quantite:=0;
 
      END LOOP; 
 
    /* On met à jour le nombre de calories pour le dragon courant */
     UPDATE dragons SET dragons.nombrecaloriesconsommees = nb_calories
      WHERE dragons.dragon = un_dragon.dragon; 
 
      nb_calories:=0;
  END LOOP;
END;
/
 
/*execute update_nb_calories;
/*/
Ah oui et petite question, on peut déclarer un curseur sans pour autant l'initialiser dès le début ? Dans tous les exemples que j'ai pu voir il était directement initialisé...

Merci d'avance pour votre aide !
Bonne soirée !