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 09/11/2011, 16h25   #1
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Par défaut Fonction en PL/SQL

bonsoir!voici mes tables:
Produits (Num_Pro,Lib_Pro,Prix_U,Qtestock,Seuil_Reapro);
Ligne_Coms (Num_Com ,Num_Pro ,Qte_Com);

j'ai écrit une fonction qui vérifie renvoie true si la quantité commandée est inférieure à la quantité en stock sinon elle renvoie false.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION verifier_qtecom(qtes IN Produits.Qtestock%Type
    ,qtec IN NUMBER
    , np IN Produits.Num_Prod%TYPE
	) RETURN BOOLEAN IS
  BEGIN
       SELECT Qtestock INTO qtes FROM  Produits WHERE Num_Pro=np ;
       IF qtes>qtec THEN
         RETURN( TRUE) ;
		 ELSE   RETURN( FALSE) ;
		END IF;
 
  END;
Après l’exécution, Oracle me dit: fonction créée avec erreurs de compilation.
Quelqu'un peut m’aider ?
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 16h46   #2
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Bonjour,
L'instruction SQL suivante permet d'obtenir le message d'erreur de compilation :
Code sql :
SHOW ERROR FUNCTION verifier_qtecom
Et l'erreur qui sera donnée indiquera probablement que la variable "qtes" est définie en tant que paramètre d'entrée (IN), et ne peut donc pas être modifiée avec un SELECT INTO.
Quelle est l'objectif de ce paramètre ? Si c'est simplement pour stocker le résultat de la requête de façon temporaire, le temps de vérifier sa valeur, alors il ne faut pas utiliser un paramètre, mais une variable locale.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/11/2011, 17h50   #3
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Utiliser une variable locale comme ceci? :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION verifier_qtecom(qtec IN NUMBER
    , np IN Produits.Num_Pro%TYPE
	) RETURN BOOLEAN IS
	qtes Produits.Qtestock%TYPE;
  BEGIN
       SELECT Qtestock INTO qtes FROM  Produits WHERE Num_Pro=np ;
       IF qtes>qtec THEN
         RETURN( TRUE) ;
		 ELSE   RETURN( FALSE) ;
		END IF;
  END;
est ce que le code est bon?
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 18h31   #4
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Ca me paraît bon.
Pour être plus propre, pour le paramètre qtec, on peut utiliser Produits.Qtestock%TYPE plutôt que NUMBER.
Sinon, à vu de nez, ça doit compiler correctement.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/11/2011, 18h38   #5
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 545
Points : 7 545
Citation:
Envoyé par yabo84 Voir le message
est ce que le code est bon?
Tu ne prévois pas le cas où la ligne n'est pas trouvée dans la table, qui se pourrait se solder par une exception.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/11/2011, 19h08   #6
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Citation:
Citation:
Tu ne prévois pas le cas où la ligne n'est pas trouvée dans la table, qui se pourrait se solder par une exception.
En fait je fais mon premier pas dans pl/sql donc je n e connais pas grand chose dans ce langage. Comment gérer ce type d'erreur qu'on appelle EXCEPTION dans mon cas?
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 19h56   #7
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Il y a ce tutoriel assez complet et bien fait : http://sheikyerbouti.developpez.com/pl_sql/, et concernant la gestion des erreurs ou EXCEPTIONS ici http://sheikyerbouti.developpez.com/...age=Chap1#L1.3.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 23h04   #8
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Par défaut probleme de trigger

Bonsoir!
J'ai un problème avec mon trigger :
voici mes tables:
Commandes (Num_Com ,Date_Com,Nbre_lc,Mtot_Com,Num_Cli);
Ligne_Coms (Num_Com,Num_Pro,Qte_Com)
voici mon trigger:
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 TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
 
BEGIN
   IF (verifier_qtecom(Qte_Com,Num_Pro)) then
    BEGIN
		UPDATE Commandes 
			SET nbre_lc= nbre_lc+1 WHERE Ligne_Coms.Num_Com=Commandes.Num_Com ;
		UPDATE Commandes
			SET Mtot_Com = Mtot_Com + :new.Qte_Com * Prix_U WHERE Num_Com = :new.Num_Com;
 
		UPDATE Produits
			SET qtestock = qtestock - :new.Qte_Com  WHERE Num_Pro = :new.Num_Pro;
		COMMIT;
	END;
  ELSE 
   BEGIN
      DBMS_OUTPUT.PUT_LINE('Ajout annulé') ;
	  ROLLBACK; 
	END;
 end IF;
END;
1- J'ai des problèmes de compilation : la fonction show err me donne :
Code :
1
2
2/4 	PL/SQL: Statement ignored
2/24 	PLS-00201: l'identificateur 'QTE_COM' doit être déclaré
Je n'arrive pas à le corriger.
2-Mon trigger est sensé incrémenter le nbre_lc, recalculer le Mot_com et soustraire le qtestock si la fonction verifier_qtecom(Qte_Com,Num_Pro)==true sinon annuler l'ajout.
Est-ce que mon trigger répond à la question ?
yabo84 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 10h38.


 
 
 
 
Partenaires

Hébergement Web