Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec 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 04/11/2011, 01h10   #1
Invité de passage
 
Homme
Collégien
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Collégien

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 0
Points : 0
Par défaut Aide pour une fonction

Bonjour je suis débutant en SQL et j'aurais besoin d'aide...
Je dois concevoir une fonction qui prend un valeur dans une table et retourne la réponse dans une autre colonne de la même table.

Le code de ma table:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE Inscription
(codePermanent 	CHAR(12) 	NOT NULL,
 sigle 		CHAR(7) 	NOT NULL,
 noGroupe	INTEGER		NOT NULL,
 codeSession	INTEGER		NOT NULL,
 dateInscription DATE		NOT NULL,
 dateAbandon	DATE,
 note		INTEGER,
 cote         CHAR(1),
CONSTRAINT CléPrimaireInscription PRIMARY KEY 	(codePermanent,sigle,noGroupe,codeSession),
CONSTRAINT CERefGroupeCours FOREIGN KEY 	(sigle,noGroupe,codeSession) REFERENCES GroupeCours,
CONSTRAINT CECodePermamentRefEtudiant FOREIGN KEY (codePermanent) REFERENCES Etudiant
)
/
Ce qu'il faut faire est prendre la note et donner la cote correspondante

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION fCotePourNote(note_ INTEGER)
  RETURN CHAR;
BEGIN
  CASE
    WHEN note_ >=90 THEN cote_ := 'A';
    WHEN note_ >=80 AND note_ < 90 THEN cote_ := 'B';
    WHEN note_ >=70 AND note_ < 80 THEN cote_ := 'C';
    WHEN note_ >=60 AND note_ < 70 THEN cote_ := 'D';
    WHEN note_ >=0 AND note_ < 60 THEN cote_ := 'E';
    ELSE cote_ := NULL;
  END CASE;
  RETURN cote_
END;
/
Et faire un update dans la table avec la fonction

Code :
1
2
3
4
UPDATE Inscription
SET cote = fCotePourNote(SELECT note FROM Inscription WHERE codePermanent = 'TREJ18088001' AND sigle = 'INF1110' AND noGroupe = 20 AND codeSession = 32003)
WHERE codePermanent = 'TREJ18088001' AND sigle = 'INF1110' AND noGroupe = 20 AND codeSession = 32003
/
Malheureusement je suis incapable de faire fonctionner ma fonction...

Merçi d'avance pour votre aide
otbdotcom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 02h22   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Au niveau de la fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION fCotePourNote(note_ IN INTEGER)
  RETURN CHAR DETERMINISTIC
  IS cote_ CHAR(1);
BEGIN
  cote_ := CASE
             WHEN note_ >= 90 THEN 'A'
             WHEN note_ >= 80 THEN 'B'
             WHEN note_ >= 70 THEN 'C'
             WHEN note_ >= 60 THEN 'D'
             WHEN note_ >=  0 THEN 'E'
           END;
  RETURN (cote_);
END;
/
Notez que j'ai supprimé dans le CASE les AND note_ < 90...
En effet, le case ne passe à une condition suivante que si l'actuelle n'est pas remplie.
Le CASE ici est la fonction SQL standard que vous pouvez tester avec dual :
Code :
1
2
3
SELECT dummy
     , CASE WHEN dummy = 'X' then 1 else 0 end AS test
  FROM dual;
Pour l'appel :
Code :
1
2
3
4
5
6
7
UPDATE Inscription
   SET cote          = fCotePourNote(note)
 WHERE codePermanent = 'TREJ18088001'
   AND sigle         = 'INF1110'
   AND noGroupe      = 20
   AND codeSession   = 32003
/
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/11/2011, 18h57   #3
Invité de passage
 
Homme
Collégien
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Collégien

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 0
Points : 0
Merci beaucoup!!!!
otbdotcom 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 06h00.


 
 
 
 
Partenaires

Hébergement Web