Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 11h14   #1
kryptong
Membre du Club
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 160
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 160
Points : 43
Points : 43
Par défaut Qu'est ce qui ne marche pas ?

Bonjour,
J'ai fais une procédure PL/SQL qui permet de faire la mise à jour d'une table COMMANDE en faisant une remise sur les montants de certaines commandes .
Le problème c'est que la procédure qui s'exécute sans erreurs ne m'affiche pas le résultat désiré , en fait lorsque j'affiche ma table je trouve que au lieu de faire une remise sur le montant elle remplace ce montant par un vide (probablement NULL), 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
CREATE OR REPLACE PROCEDURE RemiseCommande  IS
 
CURSOR mnt_cr IS SELECT NUM_C ,MATRICULE, DATE_C ,MONTANT  FROM COMMANDE WHERE NUM_C IN (1,3);
cmd COMMANDE %rowtype;
mnt_cmd real;
n number(2);
commandevide EXCEPTION;
BEGIN
SELECT COUNT(*) INTO n FROM COMMANDE;
IF n=0 THEN
RAISE commandevide;
END IF;
FOR cmd IN mnt_cr LOOP
mnt_cmd:=cmd.MONTANT;
IF cmd.NUM_C=1 then
mnt_cmd:=0.7*mnt_cmd;
ELSE mnt_cmd:=0.25*mnt_cmd;
END IF;
UPDATE COMMANDE SET MONTANT=cmd.MONTANT-mnt_cmd WHERE (NUM_C =cmd.NUM_C);
END LOOP;
EXCEPTION
WHEN commandevide THEN RAISE_APPLICATION_ERROR(-20501,'Pas de commande !');
END;
/
  execute  RemiseCommande;

Quelqu'un pourra il m'aider ?
kryptong est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 11h30   #2
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

Informations professionnelles :
Activité : Senior Consultant DBA (Trivadis SA)
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
Hello,

Soit
cmd.MONTANT est null
ou
cmd.NUM_C est null ce qui pourrait entrainer que mnt_cmd soit null

d'ou résultat = null

jko
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 11h34   #3
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 115
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 4 115
Points : 8 010
Points : 8 010
Supprimez la déclaration inutile de la variable cmd. Null besoin d'un curseur et d'une boucle pour ce type de problème.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
CREATE OR REPLACE PROCEDURE RemiseCommande IS
Begin
  UPDATE COMMANDE
     SET MONTANT = Round(MONTANT - Case Num_c 
                               When 1 Then 0.7 * Montant
                               Else 0.25 * Montant
                             End
                         ,2)
   WHERE NUM_C IN (1, 3);
  -- 
  IF Sql%rowCount = 0 
  Then
    RAISE_APPLICATION_ERROR(-20000, 'Pas de commande à mettre à jour!');
  End IF;   
End;
/
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 17/12/2012, 13h41   #4
kryptong
Membre du Club
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 160
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 160
Points : 43
Points : 43
Merci, ma solution elle vient de fonctionner correctement aussi mais la tienne est beaucoup plus optimisée
kryptong est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h55.


 
 
 
 
Partenaires

Hébergement Web