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 :

Création d'un trigger de mise à jour [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Création d'un trigger de mise à jour
    Bonjour

    Je souhaite créer un trigger sous ORACLE qui met a jour le stock(quantité) dans la table produit après une insertion d'une ligne dans la table commande. le code sql est :
    Table produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     CREATE TABLE `produit_` (
    	`idproduit` INT(11) NOT NULL AUTO_INCREMENT,
    	`nom_produit` VARCHAR(50) NOT NULL DEFAULT '0',
    	`quantite` INT(4) UNSIGNED ZEROFILL NOT NULL DEFAULT '0000',
    	`prix_unitaire` INT(11) NOT NULL DEFAULT '0',
    	PRIMARY KEY (`idproduit`)
    )
    COLLATE='utf8mb4_0900_ai_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=11
    ;
    la table commande:
    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
     
     
    CREATE TABLE `commande` (
    	`idcommande` INT(11) NOT NULL AUTO_INCREMENT,
    	`idperso` INT(11) NOT NULL,
    	`quantiteComm` INT(4) UNSIGNED ZEROFILL NOT NULL,
    	`idprod` INT(11) NOT NULL DEFAULT '0',
    	`datecomm` VARCHAR(50) NOT NULL DEFAULT '0',
    	PRIMARY KEY (`idcommande`, `idperso`, `idprod`),
    	INDEX `FK_commande_personnes` (`idperso`),
    	INDEX `FK_commande_produit_` (`idprod`),
    	CONSTRAINT `FK_commande_personnes` FOREIGN KEY (`idperso`) REFERENCES `personnes` (`Idpersonne`),
    	CONSTRAINT `FK_commande_produit_` FOREIGN KEY (`idprod`) REFERENCES `produit_` (`idproduit`)
    )
    COLLATE='utf8mb4_0900_ai_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=7
    ;
    Le trigger que j'ai créée est :
    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 trigger stockage
    after insert on commande 
    for each row 
     Begin
     
     select  commande.quantiteComm , produit_.quantite
    		from commande, produit_ 
    		where (commande.idcommande=  LAST_INSERT_ID() and produit_.idproduit= commande.idprod) ;
     
    	if (produit_.quantite>commande.quantiteComm) then 
    		update on produit_ p
    		set    p.quantite = p.quantite -commande.quantiteComm
    		where   commande.idcommande=  LAST_INSERT_ID() and p.idproduit = commande.idprod;
    		end if;
    END;
    /
    Je souhaite de l'aide de quelq'un ? Un grand merci d'avance pour les aide futur.

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    avril 2013
    Messages
    1 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 1 652
    Points : 1 999
    Points
    1 999
    Par défaut
    Et quel est le pb?
    Tu as un message d'erreur? Le résultat n'est pas bon?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 738
    Points : 1 182
    Points
    1 182
    Par défaut
    Bonjour,

    Les ordres de création des tables ne sont des instructions Oracle.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 730
    Points : 29 089
    Points
    29 089
    Par défaut
    Quand je lis ENGINE=InnoDB, j'en déduis qu'il ne s'agit pas d'Oracle mais de MySQL...
    Me trompe-je ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    Et quel est le pb?
    Tu as un message d'erreur? Le résultat n'est pas bon?
    Merci pour votre reponse.
    Le resultat n'est pas bon. ma question est pour l'ecriture d'un trigger qui fonctionne sous oracle et mysql . avec mysql le message d'erreur est : # 1064 - You have an error in your SQL syntax; check the manual.

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Les ordres de création des tables ne sont des instructions Oracle.
    Bonjour, oui il s'agit du mysql. Comment je puisse créer un trigger en oracle. je vais de l'aide pour l'ecriture de mon trigger sous oracle.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 738
    Points : 1 182
    Points
    1 182
    Par défaut
    Essaie:

    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
    create trigger stockage
    after insert on commande 
    for each row 
    declare
    v_qte number;
     
    begin
     select produit_.quantite
     into v_qte
     from produit_ 
     where produit_.idproduit = :new.idprod;
     
     if v_qte > :new.quantiteComm then
       update produit_
       set quantite = quantite - :new.quantiteComm
       where idproduit = :new.idprod;
     end if;
     
    end;
    /
    Si idprod est clé étrangère de idproduit alors tu ne devrais pas avoir à gérer l'erreur sur le select into. Je ne sais pas si au niveau quantité tu peux avoir des null (théoriquement non sinon pas de commande, mais bon).

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 730
    Points : 29 089
    Points
    29 089
    Par défaut
    Citation Envoyé par gomisse_momo Voir le message
    ma question est pour l'ecriture d'un trigger qui fonctionne sous oracle et mysql .
    Tu ne peux malheureusement pas avoir de trigger qui fonctionne à la fois pour Oracle et pour MySQL.
    Une version normalisée du langage SQL procédural existe bien mais elle n'est pas prise en compte, ou de manière très imparfaite, par les éditeurs de SGBD.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Essaie:

    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
    create trigger stockage
    after insert on commande 
    for each row 
    declare
    v_qte number;
     
    begin
     select produit_.quantite
     into v_qte
     from produit_ 
     where produit_.idproduit = :new.idprod;
     
     if v_qte > :new.quantiteComm then
       update produit_
       set quantite = quantite - :new.quantiteComm
       where idproduit = :new.idprod;
     end if;
     
    end;
    /
    Si idprod est clé étrangère de idproduit alors tu ne devrais pas avoir à gérer l'erreur sur le select into. Je ne sais pas si au niveau quantité tu peux avoir des null (théoriquement non sinon pas de commande, mais bon).
    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
    -- oui  idprod est clé étrangère de idproduit
    CONSTRAINT `FK_commande_produit_` FOREIGN KEY (`idprod`) REFERENCES `produit_` (`idproduit`)
    
    ****************** Table produit_*************************
    CREATE TABLE `produit_` (
    	`idproduit` INT(11) NOT NULL AUTO_INCREMENT,
    	`nom_produit` VARCHAR(50) NOT NULL DEFAULT '0',
    	`quantite` INT(4) UNSIGNED ZEROFILL NOT NULL DEFAULT '0000',
    	`prix_unitaire` INT(11) NOT NULL DEFAULT '0',
    	PRIMARY KEY (`idproduit`)
    );
    ****************** Table commande*************************
    CREATE TABLE `commande` (
    	`idcommande` INT(11) NOT NULL AUTO_INCREMENT,
    	`idperso` INT(11) NOT NULL,
    	`quantiteComm` INT(4) UNSIGNED ZEROFILL NOT NULL,
    	`idprod` INT(11) NOT NULL DEFAULT '0',
    	`datecomm` VARCHAR(50) NOT NULL DEFAULT '0',
    	PRIMARY KEY (`idcommande`, `idperso`, `idprod`),
    	INDEX `FK_commande_personnes` (`idperso`),
    	INDEX `FK_commande_produit_` (`idprod`),
    	CONSTRAINT `FK_commande_personnes` FOREIGN KEY (`idperso`) REFERENCES `personnes` (`Idpersonne`),
    	CONSTRAINT `FK_commande_produit_` FOREIGN KEY (`idprod`) REFERENCES `produit_` (`idproduit`)
    );

  10. #10
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Je vous remercie infiniment le trigger fonctionne correctement .
    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 stockage
    after insert on commande 
    for each row 
    declare
    v_qte number;
     
    begin
     select produit_.quantite
     into v_qte
     from produit_ 
     where produit_.IDProduit = :new.idprod;
     
     if v_qte > :new.quantiteComm then
       update produit_
       set quantite = quantite - :new.quantiteComm
       where IDProduit = :new.idprod;
     end if;
     
    end;
    /

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/11/2007, 19h27
  2. Création dynamique de rectangles et mise à jour
    Par petitours dans le forum IHM
    Réponses: 2
    Dernier message: 16/06/2007, 09h40
  3. triggers insertion, mise à jour, suppression
    Par bibi_forever dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/05/2007, 11h22
  4. Création d'un recorset de mise à jour
    Par Gabout dans le forum Access
    Réponses: 2
    Dernier message: 12/05/2006, 10h17
  5. Réponses: 2
    Dernier message: 10/03/2006, 13h55

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