IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Qu'est ce qui ne marche pas ?


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    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
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    /

  4. #4
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Merci, ma solution elle vient de fonctionner correctement aussi mais la tienne est beaucoup plus optimisée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Flex4] TextInput.addChild Qu'est ce qui ne marche pas.
    Par yvancoyaud dans le forum Flex
    Réponses: 6
    Dernier message: 17/06/2012, 05h16
  2. [SP-2010] event receiver qui ne marche pas quand il est couplé avec un content type
    Par cekamb72 dans le forum SharePoint
    Réponses: 6
    Dernier message: 29/08/2011, 18h53
  3. [AJAX] Qu'est ce qui ne marche pas
    Par Anthony.Desvernois dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/09/2007, 00h04
  4. Qu'est ce qui ne marche pas
    Par Maria1505 dans le forum C++
    Réponses: 6
    Dernier message: 19/01/2007, 02h29
  5. Réponses: 14
    Dernier message: 27/08/2006, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo