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 :

Calcul de multiplication en utilisant un curseur


Sujet :

PL/SQL Oracle

Vue hybride

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut Calcul de multiplication en utilisant un curseur
    Bonjour ,

    Depuis deux jours je suis bloqué sur un énorme soucis notamment le calcul des multiplications dans une table.

    En fait, je dois utiliser des curseurs pour effectuer des calculs (additions ou multiplications).
    Dans une table je pointe mon curseur pour voir le type de l'opération (champ en varchar : "SUM" ou "MULT") :
    • si ope = SUM alors j'insère dans une autre table la sum
    • si ope = MULT alors j'insère la multiplication


    De mon côté , j'ai créé deux curseurs un qui pointe sur la table où on définit les opérations (ID_AGG, OPERATION) et un autre sur une requête permettant de récupérer ID_AGG (jointure avec la table opération).

    J'espère que j'ai bien décrit mon soucis.

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Ben si depuis 2 jours c'est aussi confus dans ton esprit que l'est ton message, ça m'étonne pas que tu galère lol...

    Au delà de cette méchanceté gratuite, explique nous comment on peut comprendre quoi que ce soit à ce que tu racontes, tu ne nous renseigne absolument sur rien, pas la nature de l'erreur, pas les requetes impactée etc...

    Essaye d'isoler ton problème pour exprimer quelque chose d'intelligible de l'extérieur...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    Merci tout de même d'avoir répondu même si c'était pas top .

    Alors pour bien détailler mon soucis:
    j'ai une table opération qui a pour champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C_AGG       LIBELLE      OPERATION
    A1              TOTO         SUM
    A2              TATA         MULTI
    A3              TITI           RATIO
    J'ai une table DATA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID_DATA     MESURE          VALEUR
    1                     AA1            122
    2                     AA2            566
    3                     AA1            456
    4                     AA2            147
    Et une table MESURES
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MESURE           LIBELLE
    AA1                  TOTO
    AA2                  TATA
    AA3                  TITI
    Donc j'ai utilisé deux curseurs :
    un sur la table OPERATION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CURSOR CALCUL_CUR IS
            SELECT C_AGG ,OPER FROM OPERATION
            DATA_AGG CALCUL_CUR%ROWTYPE;
    Un autre sur la requête permettant d'assurer la jointure des trois tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CURSOR DATA_CUR IS
    SELECT C_AGG, ID_DATA.....
    DATA_VALEUR DATA_CUR%ROWTYPE;
    Ce que je devais faire c'est dans ma table cible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C_AGG                 VALEUR
    A1                         122+456
    A2                         566 * 147
    C'est plus clair non ?

  4. #4
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Es tu sur que le curseur soit indispensable ?

    Au départ je voyais bien une requête du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select O.C_AGG,
    CASE 
     WHEN O.OPERATION = 'SUM' THEN SUM(D.VALEUR)
     WHEN O.OPERATION = 'MULTI' THEN MUL(D.VALEUR)
    END
     from 
     OPERATION O,
     DATA D,
     MESURES M
    where 
          O.LIBELLE = M.LIBELLE
    and M.MESURE = D.MESURE
    group by O.OPERATION, O.C_AGG
    Et là, tu vas me dire que la fonction d'aggregat "MUL" n'existe pas...

    Donc soit tu la reconstitues par quelque chose du style : "EXP(SUM(LN(NN)))" à supposer que tu n'ai pas de 0 ni de négatif, (sinon il faut faire des trucs un peu plus subtils,) soit il existe un moyen plus adapté pour faire cette aggrégat (qui ne me vient pas à l'idée pour l'instant ) soit tu peux faire carrément une fonction stockée qui fait tout en fonction du code aggregat et du code oppération.

    ça va donner un truc du style aux erreurs de syntaxe près...

    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
    create or replace fonction_qui_fait_tout(i_cagg, i_type_op) return number is
    ret number;
    begin
     if (i_type_op = 'MUL') then ret = 1 else ret = 0 end if;
     for f in (
       select D.VALEUR from 
         OPERATION O,
         DATA D,
         MESURES M
      where 
            O.C_AGG = i_cagg
      and O.LIBELLE = M.LIBELLE
      and M.MESURE = D.MESURE
      ) loop
      if (i_type_op = 'MUL') then ret = ret * f.VALEUR else ret = ret + f.VALEUR end if;
      end loop;
     return ret;
    END;
    /
    ta requete sera simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select C_AGG, fonction_qui_fait_tout(C_AGG,OPERATION) VALEUR from OPERATION;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    Merci je vais tester cela et je te tiendrai au courant.

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

Discussions similaires

  1. [Débutant] Utilisation de curseurs
    Par snoopy69 dans le forum Oracle
    Réponses: 17
    Dernier message: 14/06/2006, 08h50
  2. Réponses: 2
    Dernier message: 16/05/2006, 09h57
  3. calcul dans multiple Tedit
    Par stefano dans le forum Langage
    Réponses: 6
    Dernier message: 12/03/2006, 23h50
  4. [TChart] Comment utiliser le curseur sur une courbe ?
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/09/2005, 16h49
  5. utilisation de curseur
    Par diunisu06 dans le forum Sybase
    Réponses: 5
    Dernier message: 26/06/2003, 12h08

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