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 :

Trigger comparer 2 sommes avant inserer [19c]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 4
    Par défaut Trigger comparer 2 sommes avant inserer
    Bonjour à tous,
    Je suis nouveau dans le forum et débutant dans le SQL Oracle.
    Je dois vérifier la quantité totale déposée pour un type de déchet dans la table detaildepot ne soit pas supérieur à la quantité totale collectée dans la tournée dans la tabledetaildemande.

    Voici ce que j'ai fait mais il m'indique une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace TRIGGER verifqttdepose
    BEFORE insert or update of quantitedeposee
    ON detaildepot FOR EACH ROW
    DECLARE
    qtotal number(50);
    BEGIN
    SELECT SUM(quantitedeposee)FROM detaildepot WHERE detaildepot.notypedechet = '1' AND detaildepot.notournee='6' INTO qtotal FROM dual;
          IF
          (qtotal > (SELECT SUM(quantiteenlevee_kg)FROM detaildemande WHERE detaildepot.notypedechet = '1' AND detaildepot.notournee='6'))        
            THEN
                RAISE_APPLICATION_ERROR(-20000,'La quantitée ne peut pas être supérieur à la quantitée prélevée');
        END IF;
    END;
    LINE/COL ERROR
    --------- -------------------------------------------------------------
    4/1 PL/SQL: SQL Statement ignored
    4/112 PL/SQL: ORA-00933: la commande SQL ne se termine pas correctement
    Merci beaucoup pour votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Voys avez 2 FROM dans le SELECT et le INTO doit se mettre après la valeur SELECTionnée, avant le FROM.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 4
    Par défaut
    Merci

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 4
    Par défaut
    En fait le code ne fonctionne pas, je l'ai changé :
    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
    CREATE OR REPLACE TRIGGER verifqttdepose BEFORE
        INSERT OR UPDATE OF quantitedeposee ON detaildepot
        FOR EACH ROW
    DECLARE
        qenl   NUMBER;
        qtotal NUMBER;
        TABLE_MUTANTE EXCEPTION;
        PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
    BEGIN
        SELECT SUM(e.quantitedeposee) INTO qtotal
        FROM detaildepot e
        WHERE e.notournee = 3 AND e.notypedechet= 2;
     
        SELECT
            SUM(a.quantiteenlevee_kg)
        INTO qenl
        FROM
              detaildepot e,   detaildemande a
            INNER JOIN demande     d ON d.nodemande = a.nodemande
        WHERE
                a.notypedechet = e.notypedechet
            AND d.notournee = e.notournee;
     
        IF qtotal < :new.quantitedeposee + qenl THEN
            raise_application_error(-20001, 'Vérifier la quantité entrée');
        END IF;
        EXCEPTION
            WHEN TABLE_MUTANTE THEN 
            DBMS_OUTPUT.PUT_LINE('Fausse alerte');
    END;
    Le triger est compilé sans erreur mais lorsque je modifie une valeur j'ai cette erreur :
    Erreur lors de l'enregistrement des modifications de la table "C##BD_TEST_RECYCL"."DETAILDEPOT" :
    Ligne 12 : ORA-04091: la table C##BD_TEST_RECYCL.DETAILDEPOT est en mutation ; le déclencheur ou la fonction ne peut la voir
    ORA-06512: à "C##BD_TEST_RECYCL.VERIFQTTDEPOSE", ligne 5
    ORA-04088: erreur lors d'exécution du déclencheur 'C##BD_TEST_RECYCL.VERIFQTTDEPOSE'
    Est ce que quelqu'un a une idée de comment résoudre cette erreur ?

    Merci

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Ce genre de règle métier n'a rien à faire dans un trigger et encore moins un trigger BEFORE.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 4
    Par défaut
    Ah je ne savais pas merci mais qu'est ce qu'il faudrait faire ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    Ce genre de règle métier n'a rien à faire dans un trigger et encore moins un trigger BEFORE.
    Affirmation stupide d'autant qu'aucun commentaire ne vient l'étayer ! Les règles métiers c'est pas automatiquement dans un service applicatif.... ne serait-ce que pour des raisons de performances.
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [Trigger] comparer chaine de caractères
    Par tck-lt dans le forum PL/SQL
    Réponses: 2
    Dernier message: 06/12/2011, 12h03
  2. [XL-2010] Comparer max (sommes de cellules)
    Par ift1902 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/11/2011, 01h24
  3. [Batch] Comparer la somme de plusieurs fichiers
    Par jobar38 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/02/2011, 11h04
  4. [AC-2003] comparer 2 tables et inserer des valeurs dans une des tables
    Par sanaab dans le forum VBA Access
    Réponses: 0
    Dernier message: 08/06/2010, 14h55
  5. Réponses: 20
    Dernier message: 15/05/2009, 14h05

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