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

SQL Oracle Discussion :

problème dans une procédure


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 67
    Par défaut problème dans une procédure
    Bonjour à tous,

    Voilà j'ai fais une procédure qui est la suivante

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     
    IS
     
    XCB number(6,2);
    XCHEQUE number(6,2);
    XAUTRE number(6,2);
    XTOTAL number(6,2);
     
    BEGIN
     
    XCB:=0;
    XCHEQUE:=0;
    XAUTRE:=0;
    XTOTAL:=0;
     
    delete from RECETTE;
     
    for x in (select * from PUBLICATION)
    loop
     
    	select sum(TARIFOFUP) into XCHEQUE
    	from ABONNEMENT, SOUSCRIPTION
    	where ABONNEMENT.REFAB = SOUSCRIPTION.REFAB
    	and TITRE = x.TITRE
    	and TYPEPAI = 1;
     
    	select sum(TARIFOFUP) into XCB
      from ABONNEMENT, SOUSCRIPTION
      where ABONNEMENT.REFAB = SOUSCRIPTION.REFAB
      and TITRE = x.TITRE
      and TYPEPAI = 2;
     
    	select sum(TARIFOFUP) into XAUTRE
            from ABONNEMENT, SOUSCRIPTION
            where ABONNEMENT.REFAB = SOUSCRIPTION.REFAB
            and TITRE = x.TITRE
            and TYPEPAI = 3;
     
    	XTOTAL := XCHEQUE + XCB + XAUTRE;
     
    	insert into RECETTE (TITRE, CB, CHEQUE, AUTRE, TOTAL)
    	values (x.TITRE, XCB, XCHEQUE, XAUTRE, XTOTAL);
     
    end loop;
     
    commit;
     
    END;
    En fait elle m'insere bien les valeurs désirées, hormis la valeur XTOTAL ... si quelqu'un voit une erreur merci de me la renseigner !

    +

    Greg

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    quelques remarques :

    1°)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR x IN (SELECT * FROM PUBLICATION)
    pourquoi ne pas sélectionner que le titre ?

    2°)
    3 sommes peuvent être écrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT sum(DECODE(TYPEPAI,1,TARIFOFUP,0)),
               sum(DECODE(TYPEPAI,2,TARIFOFUP,0)),
               sum(DECODE(TYPEPAI,3,TARIFOFUP,0))
     INTO XCHEQUE,XCB,XAUTRE
     FROM ABONNEMENT, SOUSCRIPTION
    WHERE ABONNEMENT.REFAB = SOUSCRIPTION.REFAB
         AND TITRE = x.TITRE
    Ou mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FOR i IN (	SELECT sum(TARIFOFUP) somme, TYPEPAI
    	FROM ABONNEMENT, SOUSCRIPTION
    	WHERE ABONNEMENT.REFAB = SOUSCRIPTION.REFAB
    	AND TITRE = x.TITRE
            GROUP BY TYPEPAI
    ) LOOP
     
    CASE i.typepai 
       WHEN  1 THEN XCHEQUE = i.somme; 
       WHEN  2 THEN XCB  = i.somme;
       WHEN  3 THEN  XAUTRE =  i.somme;
    END CASE;
     
    END LOOP;
    3°)
    c'est inutile de stocker le total si c'est le résultat d'un calcul des colonnes déjà présente dans la table (cf normes merise )

    4°)
    INSERT AS SELECT serait beaucoup mieux

    En une seulle commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO RECETTE (TITRE, CB, CHEQUE, AUTRE)
    SELECT SOUSCRIPTION.TITRE,
               sum(DECODE(TYPEPAI,1,TARIFOFUP,0)),
               sum(DECODE(TYPEPAI,2,TARIFOFUP,0)),
               sum(DECODE(TYPEPAI,3,TARIFOFUP,0))
     FROM ABONNEMENT, SOUSCRIPTION,PUBLICATION 
    WHERE ABONNEMENT.REFAB = SOUSCRIPTION.REFAB
         AND SOUSCRIPTION.TITRE = PUBLICATION .TITRE;
    5°)
    Doit être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRUNCATE TABLE RECETTE REUSE STORAGE;
    pas d'utilisation des rollbacks exécution immédiate

    Je sais... j'ai pas répondu à la question

  3. #3
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par Fred_D
    ....
    Doit être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRUNCATE TABLE RECETTE REUSE STORAGE;
    pas d'utilisation des rollbacks exécution immédiate
    ...
    En parlant d'execution immediate:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'TRUNCATE TABLE RECETTE REUSE STORAGE';


    Sinon, à vue de nez je pense que le problème vient du fait que certaines de tes variables peuvent etre nulles car un SUM sur 0 ligne donne null. Et de plus pour oracle une opération avec null donne un résultat null.

    Ex:
    10 + 20 + null = null

    Il faut donc utiliser nvl soit dans la somme, soit dans requête:
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     XTOTAL := nvl(XCHEQUE,0) + nvl(XCB,0) + nvl(XAUTRE,0);
    Mais je te conseille de prendre en compte les remarques de Fred car il plus efficace de faire des requêtes ensembliste que des boucles en PL/SQL.

Discussions similaires

  1. Problème dans une procédure
    Par visvis_id dans le forum PL/SQL
    Réponses: 5
    Dernier message: 23/05/2015, 21h29
  2. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  3. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45
  4. Problème d'alter table dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2005, 09h19
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

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