Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 09/12/2007, 14h50   #1
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
Par défaut [PL/SQL] Problème de IF dans une procédure

Bonjour à tous,

Je débute en PL/SQl et j'ai un problème dans une procédure.
Dans cette procédure, je dois tester si une valeur est comprise entre 2 entiers. J'ai essayer de faire ce test avec plusieurs syntaxes différentes mais j'ai toujours la même erreur. Quand j'essaye de compiler ma procédure, j'ai ce message qui s'affiche :

"NOT FOUND
The requested URL/apex/www_flow.show was not found on this server"

Voici comment j'ai écris mes if :

Code :
1
2
3
4
IF note>0 AND note<20 then ...
IF note>0 AND <20 then ...
IF (note>0 AND note<20) then ...
IF note BETWEEN 0 AND 20 then ...
Avec toute ces syntaxe, j'obtient toujours l'erreur d'au-dessus. De plus, je sais que l'erreur vient des if car si j'enleve par exemple note<20, la procédure est bien compilée.
Pour faire mes procédure, j'utilise Oracle Database 10g Express Edition.

J'aimerais savoir si mon erreur est une erreur de syntaxe ou alors si sa vient de Oracle parce que là je sèche. D'avance merci
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 14h46   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
C'est une manie en ce moment ?
Merci de faire au moins "l'effort" de consulter un des tutoriels du site pour savoir utiliser la syntaxe "if ... then.. end if;" tout de même.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 15h37   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Il peut même chercher CASE
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 20h06   #4
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
Je connais la syntaxe du IF. En fait, mon problème ne vient pas du test dans le IF mais c'est que dans ma procédure, j'ai un plusieurs IF avec d'autres IF à l'interieur. Je ne comprend pas mon erreur j'ai trouvé des exemples de IF imbriqués sur Internet et ma syntaxe semble correcte. Voici mon code :

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
25
26
27
28
29
30
31
32
33
34
35
36
 
CREATE OR REPLACE PROCEDURE MAJNoteInd(numInd IN INDIVIDU.numIndividu%type,numeroFilm IN FILM.numFilm%type, note IN TEMPIND.temprealisateur%type, typeInd INTEGER, loginUtil IN CLIENT.login%type) IS
BEGIN
DECLARE
tmpAct FLOAT;
tmpRea FLOAT;
BEGIN
tmpAct:=0;
tmpRea:=0;
SELECT tempActeur INTO tmpAct FROM TEMPIND WHERE NumIndividu=numInd;
SELECT tempRealisateur INTO tmpRea FROM TEMPIND WHERE NumIndividu=numInd;
IF typeInd=2 THEN 
 
	IF tmpAct IS NULL THEN 
 
		UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(tempActeur + (temprealisateur+note)/2)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
	ELSE 
		UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(temprealisateur+note)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
	END IF;	
END IF; 
 
IF typeInd=1  THEN
 
	IF tmpRea IS NULL THEN 
		UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempRealisateur + (tempacteur+note)/2)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd ;
		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
	ELSE 
		UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempacteur+note)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd  ;
		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
	END IF;
END IF;
END;
END MAJNoteInd;
/
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 20h45   #5
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
L'imbrication des if et autres begin sont possibles, c'est sûr.
Mais je ne vois pas le problème dans ta procédure ?!
C'est quoi ton message d'erreur ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 21h36   #6
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
Dans oracle, quand je lance la compilation de la procédure avec le bouton Run, une fenetre s'ouvre avec un bouton "submit". Quand je clique sur le bouton submit, j'ai le message suivant qui apparaît :

"Not found
The requested URL /apex/wwv_flow.show was not found on this server"
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 21h48   #7
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Citation:
Envoyé par Rydley Voir le message
Dans oracle, quand je lance la compilation de la procédure avec le bouton Run, une fenetre s'ouvre avec un bouton "submit".
Avec ma boule de cristal, dois-je comprendre que tu travailles à partir d'Oracle SQL Developper ???

Si c'est ça, as-tu déjà compilé (sans erreur) ta procédure ?

Est-ce que tes requêtes ramène une seule valeur, au plus ?

Est-ce que tu es bien connecté avec ta base ?

Est-ce que tu rempli correctement les valeurs lorsque la fenêtre "RUN PL/SQL" s'ouvre ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 22h39   #8
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
J'ai essayé de supprimer manuelement la procédure que j'avais créé avant et maintenant ça marche, il n'y a plus d'erreur à la compilation mais ma procédure ne marche pas comme prévu. Par exemple, si typeind=1, ma procédure ne fait pas le "else". Quand ma table tempInd est vide, l'ajout se fait corréctement puisque tempRea est nul mais si j'ai temp mais si tempRea n'est pas nul, l'ajout ne se fait pas dans ma table tempind. Pourtant, l'ajout est pris en compte puisque l'insertion dans la table TempIndFilm se fait correctement. Est-ce que s'il n'y a pas de valeur dans une colonne de la table, le test de la valeur NULL est bon?

Au fait, le code que j'ai mis avant n'est pas tout a fait correct

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
25
26
27
28
29
30
31
32
33
34
35
36
 
CREATE OR REPLACE PROCEDURE MAJNoteInd(numInd IN INDIVIDU.numIndividu%type,numeroFilm IN FILM.numFilm%type, note IN TEMPIND.temprealisateur%type, typeInd INTEGER, loginUtil IN CLIENT.login%type) IS
BEGIN
DECLARE
tmpAct FLOAT;
tmpRea FLOAT;
BEGIN
tmpAct:=0;
tmpRea:=0;
SELECT tempActeur INTO tmpAct FROM TEMPIND WHERE NumIndividu=numInd;
SELECT tempRealisateur INTO tmpRea FROM TEMPIND WHERE NumIndividu=numInd;
IF typeInd=2 THEN 
 
        IF tmpAct IS NULL THEN 
 
                UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(temprealisateur+note)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
                INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
        ELSE 
                UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(tempacteur +(temprealisateur+note)/2)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
                INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
        END IF; 
END IF; 
 
IF typeInd=1  THEN
 
        IF tmpRea IS NULL THEN 
                UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempacteur+note)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd ;
                INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
        ELSE 
                UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempRealisateur+(tempacteur+note)/2)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd  ;
                INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
        END IF;
END IF;
END;
END MAJNoteInd;
/
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 18h46   #9
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
C'est bon j'ai reussi à faire marcher ma procédure comme je le voulais. Merci beaucoup pour l'aide que tu m'as apporté.
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 19h02   #10
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Où était le blocage ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 20h32   #11
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
En fait j'avais créé une procédure plus ancienne qui avait le même nom. Je l'ai supprimer "à la mains" et sa a marché. Ce que je ne comprend pas, c'est que dans la déclaration de ma procédure, j'ai bien mis "create or replace".

Sinon, j'ai un autre problème avec une autre procédure. Celle-ci compile sans erreur mais c'est dans l'éxecution que sa plante. Dans cette procédure, j'ai comme dans la précédente deux SELECT qui peuvent me renvoyer des valeurs nulles. Quand j'apelle ma fonction en JDBC et que les champs sont nuls, une éxeption est levée: elle m'indique:
"capture d'une exception java.sql.SQLException: ORA-01403: aucune donnée trouvée" avec la numéro de la ligne de ma procédure qui correspond à mon SELECT. Ce que je ne comprend pas, c'est que pour l'autre fonction sa marche sans problème même si la valeur demandée dans le SELECT n'est pas dans la table. Voici le code de ma nouvelle procédure:

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
25
26
27
28
29
30
31
32
33
34
35
36
 
CREATE OR REPLACE PROCEDURE MAJNoteFILM(numeroFilm IN FILM.numFilm%type, note IN TEMPIND.temprealisateur%type, typeInd INTEGER) IS 
BEGIN 
DECLARE 
CURSOR monC IS SELECT numFilm FROM TEMPFILM;
presant INTEGER;
tmpActs FLOAT;
tmpRea FLOAT;
BEGIN
presant:=-1;
tmpActs:=0;
tmpRea:=0;
SELECT tempActeurs INTO tmpActs FROM TEMPFILM WHERE NumFilm=numeroFilm;
SELECT tempRealisateur INTO tmpRea FROM TEMPFILM WHERE NumFilm=numeroFilm;
FOR elt IN monC 
LOOP
IF elt.numFilm=numeroFilm THEN presant:=1; 
END IF;
END LOOP;
 
IF presant=1 THEN 
	IF typeInd=2 THEN 
	UPDATE TEMPFILM SET tempRealisateur=(tempRealisateur+note)/2, tempFilm=(tempActeurs+((tempRealisateur+note)/2))/2 WHERE numFilm=numeroFilm; 
	ELSE 
	UPDATE TEMPFILM SET tempActeurs=(tempActeurs+note)/2, tempFilm=(tempRealisateur+((tempActeurs+note)/2))/2 WHERE numFilm=numeroFilm;
	END IF;
ELSE 
	IF typeInd=2 THEN 
	INSERT INTO TEMPFILM VALUES (numeroFilm, NULL, note, note);
	ELSE 
	INSERT INTO TEMPFILM VALUES (numeroFilm, note, NULL, note);
END IF;
END IF;
END;
END MAJNoteFilm;
/
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 21h22   #12
Invité de passage
 
Inscription : février 2007
Messages : 26
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : février 2007
Messages : 26
Points : 3
Points : 3
Ah j'ai réussi à résoudre mon deuxième problème. J'ai déplacé les SELECT et les ai mis apres presant=1. Quand presant est égal à un, c'est qu'il y a des données dans la table. Les select retournent donc bien une valeur.
Rydley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 09h32   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
sauf qu'il n'y a pas de gestion d'exception donc ça sert à rien

Si tu n'as pas de donner la procédure s'arrête avec un NO_DATA_FOUND
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h45.


 
 
 
 
Partenaires

Hébergement Web