Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/10/2007, 23h07   #1
Invité régulier
 
Inscription : février 2006
Messages : 52
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 52
Points : 9
Points : 9
Par défaut Erreur sur Fonction PL/SQL

Bonjour, je viens demander de l'aide parce que je commence à péter un cable, j'essaye de compiler une fonction PL/SQL et impossible de trouver pourquoi ça ne compile pas.. je crois avoir tout essayé..

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR REPLACE
FUNCTION APPETIT_DEPEND_DE_ECAILLES RETURN VARCHAR2 IS
 
DECLARE
  CURSOR App_ecailles IS
    SELECT d1.dragon, d1.nombreecailles, a1.totalcal AS appetit, ROUND (a1.totalcal/d1.nombreecailles,2) AS rapport
    FROM DRAGONS d1, APPETIT a1 
    WHERE d1.dragon = a1.dragon;
    App_prec App_ecailles%rowtype;
    App_cour App_ecailles%rowtype;
 
BEGIN
  OPEN App_ecailles;
    FETCH App_ecailles INTO App_prec;
    LOOP
      FETCH App_ecailles INTO App_cour;
      EXIT WHEN App_ecailles%notfound;
      IF App_cour.appetit < App_prec.appetit
        THEN RETURN('NON');
        App_prec := App_cour;
      END IF; 
    END LOOP;
  CLOSE App_ecailles; 
END APPETIT_DEPEND_DE_ECAILLES;
Mon Log de compilation:
Code :
1
2
Error(4,1): PLS-00103: Symbole "DECLARE" rencontré à la place d'un des symboles suivants :     begin function package pragma procedure subtype type use    <identificateur> <identificateur entre guillemets> form    current cursor external language Symbole "begin" a été substitué à "DECLARE" pour continuer. 
Error(24,31): PLS-00103: Symbole "end-of-file" rencontré à la place d'un des symboles suivants :     begin case declare end exception exit FOR goto IF loop mod    NULL pragma raise RETURN SELECT UPDATE while WITH    <identificateur> <identificateur entre guillemets>    <variable bind> << close current DELETE fetch LOCK INSERT    open rollback savepoint SET sql execute commit forall merge    pipe
Je bosse sous SQL Developper 1.2.1 avec une base Oracle 10g Express Edition.

Si vous avez la moindre idée de résolution, je vous remercie d'avance pour votre aide !
boudou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 06h54   #2
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

au premier coup d'oeil je dirais que tu dois enlever le declare.
Lorsque l'on crée un bloc pl ce mot est necessaire et obligatoire en cas de declaration de variable, mais lorsque l'on crée une fonction il est interdit

Par contre j'ai l'impression qu'il te manque quelque chose dans ta fonction : le cas tu ne retourne pas 'NON' (donc le 'OUI'), je ne sais plus si le pl te sortira une erreur, mais pour la comprehension c'est toujours mieux d'avoir les 2 cas

voili, voilou
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 08h34   #3
Membre chevronné
 
Avatar de shaun_the_sheep
 
Homme
Chef de projet NTIC
Inscription : octobre 2004
Messages : 1 149
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Enseignement

Informations forums :
Inscription : octobre 2004
Messages : 1 149
Points : 605
Points : 605
Bonjour,

Le DECLARE est inutile en début de fonction.

Tu déclares ensuite tes variables ou curseur entre le Is et le Begin.

Sinon quelque chose me semble curieu dans ton code :
Citation:
IF App_cour.appetit < App_prec.appetit
THEN RETURN('NON');
App_prec := App_cour;
END IF;
Je pense qu'il manque un Else soit :

Code :
1
2
3
4
5
6
 
      IF App_cour.appetit < App_prec.appetit
        THEN RETURN('NON');
      ELSE
        App_prec := App_cour;
      END IF;
shaun_the_sheep est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h47.


 
 
 
 
Partenaires

Hébergement Web