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

Oracle Discussion :

somme dans un trigger


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut somme dans un trigger
    Bonjour,

    J'ai la contrainte d'integrité suivante:

    La somme des factures pour une commande ne doit pas dépasser le prix de la commande.

    Tables:
    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
    Commande (idcom, fraisport, prixtotalcom)
    Facture (idfacture, datefacture, prixtotalfacture, idlivraisonf, idcomf)
     
    avec
    CREATE TABLE Commande (idcom number(10) NOT NULL, fraisport number(8,2), prixtotalcom number(10,2));
     
    ALTER TABLE Commande ADD CONSTRAINT PK_commande PRIMARY KEY (idcom);
     
    et
     
    CREATE TABLE Facture (idfacture number(10) NOT NULL, datefacture date, prixtotalfacture number(10,2), idlivraisonf number(10), idcomf number(10));
     
    ALTER TABLE Facture ADD CONSTRAINT PK_facture PRIMARY KEY (idfacture);
     
    ALTER TABLE Facture ADD CONSTRAINT FK_facture_idlivraisonf FOREIGN KEY (idlivraisonf) REFERENCES Livraison (idlivraison);
     
    ALTER TABLE Facture ADD CONSTRAINT FK_facture_idcomf FOREIGN KEY (idcomf) REFERENCES Commande (idcom);
    Comme je débute je souhaiterais savoir si ceci est correct:
    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
    Create trigger tig1 
    before insert on Facture
    for each row
    declare
    SomFac number(8,2));
    SomInv exception;
     
    begin
    select prixtotalcom into SomFac
    from Commande
    where idcom=:new.idcomf;
     
    if SELECT SUM(prixtotalfacture) from Facture WHERE idcomf=idcom
    then raise SomInv;
    endif;
     
    Exception
    When SomInv then raise_application_error (-20300,'La somme des factures
            est supérieur à la commande');
    When no_data_found then raise_application_error (-20322,'Identifiant de commande inconnue');
    end;

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Il y a plusieurs problèmes dans votre code.
    1. Le plus important est le problème de la "mutating table". Je vous recommande de lire attentivement ceci: http://sgbd.developpez.com/oracle/ora-04091/
    2. en PL/SQL, on peut pas écrire un SELECT directement dans un IF
    if SELECT SUM(prixtotalfacture) from Facture WHERE idcomf=idcom
    then raise SomInv;
    endif;
    Il faut passer par un SELECT ... INTO ..

  3. #3
    Membre expérimenté Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Par défaut
    Bonjour,
    Je ne suis pas sur que tu puisse directement faire (je ne l'ai jamais vu):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if SELECT SUM(prixtotalfacture) from Facture WHERE idcomf=idcom
    then raise SomInv;
    endif;
    Mais n'étantpas du tout sur, c'est a tester. Mais dans tous les cas, il te manque un comparateur dans le IF.
    Essayes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (SELECT SUM(prixtotalfacture) from Facture WHERE idcomf=idcom) > prixtotalcom then raise SomInv;
    endif;
    Sinon, pour être sur que cela fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      SomFac number(8,2)); 
      SomCom number(8,2)); 
    BEGIN
    select prixtotalcom into SomFac from Commande where idcom=:new.idcomf;
     
    SELECT SUM(prixtotalfacture) INTO SomCom from Facture WHERE idcomf=idcom;
     
    if SomFac > SomFac  then 
       raise SomInv;
    endif;

Discussions similaires

  1. Somme dans une requete
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2004, 10h40
  2. Recuperer derniere valeur modifiée dans un trigger
    Par xabs dans le forum Développement
    Réponses: 2
    Dernier message: 06/08/2004, 16h22
  3. RAZ GENERATOR dans un trigger
    Par kase74 dans le forum SQL
    Réponses: 2
    Dernier message: 08/09/2003, 18h43
  4. select dans un trigger sous Postgresql
    Par kastor_grog dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/09/2003, 17h00
  5. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51

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