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 :

Est-ce qu'un trigger sur une table peut insérer des données dans une autre table


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut Est-ce qu'un trigger sur une table peut insérer des données dans une autre table
    Bonjour,

    C'est vrai que ma question est théorique, mais je suis en cours de recherche et je n'ai pas encore trouvé de résultat.

    Est-ce qu'au sein d'un trigger (before insert sur une Table), on peut insérer quelques données de cette table dans une autre.
    À savoir que l'insertion sur la seconde table déclenche aussi un trigger (before insert).

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Oui, à condition qu'il n'y ait pas de référence circulaire (que le trigger sur ta seconde table insère dans ta première)
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Oui, à condition qu'il n'y ait pas de référence circulaire (que le trigger sur ta seconde table insère dans ta première)
    Ca fonctionne, mais helas, il y´a d´insertion des champs vident sauf la clée primaire dans la table sur laquel est declenché le trigger, et sur la deuxieme il n y´a aucune entrée.

    voila le code du trigger ainsi que le sql des deux tables en question :

    code Du trigger
    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
    50
    51
    create or replace trigger "T_DR_K"
    BEFORE
    insert on "P_HW"
    for each row
     
        -- Dieser Trigger generiert ein Primärschlüssel für Tabelle P_HW
        -- and insert values into table Printer
    begin
     DECLARE
       CHD varCHAR(5);
       N NUMBER(2);
       NN NUMBER(4);
       CH1 CHAR(3);
       ART   P_HW.PH_ART%TYPE;
       BEZ   P_HW.PH_BEZ%TYPE;
       LIEF  P_HW.PH_LIEF%TYPE;
       LIEF_DAT    P_HW.PH_LIEF_DAT%TYPE;
       FREIGAB_NR  P_HW.PH_FREIGAB_NR%TYPE;
       BEST_NR   P_HW.PH_BEST_NR%TYPE;
       BEM    P_HW.PH_BEM%TYPE;
       BEST_DAT    P_HW.PH_BEST_DAT%TYPE;
       FREIGAB_DAT  P_HW.PH_FREIGAB_DAT%TYPE;
       HERST    P_HW.PH_HERST%TYPE;
       PREIS    P_HW.PH_PREIS%TYPE;
     
     BEGIN
        CHD:=F_DR_K;
        :NEW.PH_ART:=CHD;
     
      N:=:NEW.PH_ST;
      IF N <> 0 THEN
         begin
           FOR I IN 1..N LOOP
             SELECT S_DR_K.NEXTVAL 
              INTO NN
              FROM DUAL;
     
             CH1:=LPAD(NN,3,'0');    
     
            SELECT PH_ART, PH_BEZ, PH_LIEF, PH_LIEF_DAT, PH_FREIGAB_NR, PH_BEST_NR, PH_BEM, PH_BEST_DAT, PH_FREIGAB_DAT, PH_HERST, PH_PREIS
                INTO ART,BEZ,LIEF,LIEF_DAT,FREIGAB_NR,BEST_NR,BEM,BEST_DAT,FREIGAB_DAT,HERST,PREIS 
                 FROM P_HW 
                  WHERE :NEW.PH_ART=PH_ART;
     
            INSERT INTO PRINTER(P_NR, P_ART, P_BEZ, P_LIEF, P_LIEF_DAT, P_FREIGAB_NR, P_BEST_NR, P_BEM, P_BEST_DAT, P_FREIGAB_DAT, P_HERST, P_PREIS)
                 VALUES (CH1,ART,BEZ,LIEF,LIEF_DAT,FREIGAB_NR,BEST_NR,BEM,BEST_DAT,FREIGAB_DAT,HERST,PREIS);
           END LOOP;
         end;
       END IF;
      END;
    end;
    Si les choses ne sont pas clairs :

    ici l´insertion est dans la table P_HW qui contient une ligne pour chaque reception de commande d´imprimantes, le trigger genere la cle primaire pour la table P_hw.

    ensuite le trigger prend les champs inseré dans la table P_HW et l´inserent N fois dans la table Printer, avec n est la quntitée d´imprimantes livré dans la table P_HW (sous le nom PH_ST).

    code de la table P_HW

    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
    CREATE TABLE  "P_HW" 
       (	"PH_ART" VARCHAR2(5), 
    	"PH_HERST" VARCHAR2(20), 
    	"PH_BEZ" VARCHAR2(30), 
    	"PH_LIEF" VARCHAR2(40), 
    	"PH_PREIS" NUMBER, 
    	"PH_LIEF_DAT" DATE, 
    	"PH_FREIGAB_NR" VARCHAR2(20), 
    	"PH_BEST_NR" VARCHAR2(20), 
    	"PH_BEM" VARCHAR2(150), 
    	"PH_BEST_DAT" DATE, 
    	"PH_FREIGAB_DAT" DATE, 
    	"PH_ST" NUMBER, 
    	 CONSTRAINT "P_HW_PK" PRIMARY KEY ("PH_ART") ENABLE
       )
    /
    COde de la table Printer
    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
    CREATE TABLE  "PRINTER" 
       (	"P_NR" VARCHAR2(3), 
    	"P_ART" VARCHAR2(5), 
    	"P_BEZ" VARCHAR2(30), 
    	"P_SERI" VARCHAR2(40), 
    	"P_LIEF" VARCHAR2(40), 
    	"P_LIEF_DAT" DATE, 
    	"P_FREIGAB_NR" VARCHAR2(20), 
    	"P_BEST_NR" VARCHAR2(20), 
    	"P_BEM" VARCHAR2(150), 
    	"P_BEST_DAT" DATE, 
    	"P_FREIGAB_DAT" DATE, 
    	"P_IP_ADR" VARCHAR2(15), 
    	"P_MAC_ADR" VARCHAR2(25), 
    	"P_RAUM" VARCHAR2(20), 
    	"P_TREIBER" VARCHAR2(30), 
    	"P_HERST" VARCHAR2(20), 
    	"P_USER" VARCHAR2(5), 
    	"P_PREIS" NUMBER, 
    	 CONSTRAINT "PRINTER_PK" PRIMARY KEY ("P_NR") ENABLE
       )
    /
    ALTER TABLE  "PRINTER" ADD CONSTRAINT "CON_P_US" FOREIGN KEY ("P_USER")
    	  REFERENCES  "BENUTZER" ("U_NR") ENABLE
    /
    ALTER TABLE  "PRINTER" ADD CONSTRAINT "PRINTER_FK" FOREIGN KEY ("P_ART")
    	  REFERENCES  "P_HW" ("PH_ART") ENABLE
    /

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bien sur, un trigger reste une procédure, tu peux faire des insertions/ delete, etc..

    Par contre tu ne peux pas faire un SELECT de P_HW dans un trigger for each row sur P_HW .

    En plus si tu as tout codé, pourquoi ne testes-tu pas ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par McM Voir le message
    Bien sur, un trigger reste une procédure, tu peux faire des insertions/ delete, etc..

    Par contre tu ne peux pas faire un SELECT de P_HW dans un trigger for each row sur P_HW .

    En plus si tu as tout codé, pourquoi ne testes-tu pas ?
    J´ai deja tester: La table P_HW a eu insertion d´un enregistrement vide sauf celui de la clé, et la table PRINTER n´a eu aucune nouvelle entrée (insert n´a pas fonctionnée)

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Met des traces.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_output.put_line('Point 1');
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut
    Resolution du probleme d´insertion par remplacer cette partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select CH_HERST, CH_TYPE, CH_LIEF, CH_PREIS, CH_BEZ, CH_CPU, CH_RAM, CH_FP, CH_LIEF_DAT, CH_FREIGAB_NR, CH_BESTELL_NR, CH_BEM, CH_BEST_DAT, CH_FREIGAB_DAT 
             INTO HER, TYP, LIEF, PREIS, BEZ, CPU, RAM, FP, LIEFD, FRNR, BESTNR, BEM, BESTD, FRD FROM C_HW,COMPUTER WHERE C_HW.CH_ART = :NEW.C_H_ART;

    Par la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ART := :NEW.PH_ART;
             BEZ := :NEW.PH_BEZ;
             LIEF := :NEW.PH_LIEF;
             LIEF_DAT := :NEW.PH_LIEF_DAT;    
             FREIGAB_NR := :NEW.PH_FREIGAB_NR;
             BEST_NR := :NEW.PH_BEST_NR;
             BEM := :NEW.PH_BEM;
             BEST_DAT := :NEW.PH_BEST_DAT;
             FREIGAB_DAT := :NEW.PH_FREIGAB_DAT;
             HERST := :NEW.PH_HERST;
             PREIS := :NEW.PH_PREIS;

    Mais il y´a un nouveau probleme maintenant, qui est : ORA-02291 : la contrainte d'intégrité sur le champs P_art de la table PRINTER qui correspond a une clé etrangere referencé sur PH_ART de la table P_hw.

    le probleme est que, ici j´essaye d´inserer la cle etrangere dans la table PRINTER, et la cle primaire parent n´est pas encore en place ?


    COmment faire ?

  8. #8
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par king_abdel Voir le message
    le probleme est que, ici j´essaye d´inserer la cle etrangere dans la table PRINTER, et la cle primaire parent n´est pas encore en place ?
    Avez vous essayez avec un en lieu et place du
    Signé : Capitaine Jean-Luc Picard

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par argoet Voir le message
    Avez vous essayez avec un en lieu et place du
    Oui le declencheur etait declenché avec after insert.

  10. #10
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par king_abdel Voir le message
    Oui le declencheur etait declenché avec after insert.
    Pourtant votre code indique "Before Insert"
    Signé : Capitaine Jean-Luc Picard

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par argoet Voir le message
    Pourtant votre code indique "Before Insert"
    C´est vrai, mais ce code etait avec l´utilisation de insert into.
    J´ai ensuite modifier insert into par les instructions d´affectation, et before par after
    voila le nouveau code

    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
    50
    51
    create or replace trigger "T_DR_COP"
    AFTER
    insert or update on "P_HW"
    for each row
     
    BEGIN
      DECLARE
       N NUMBER(4);
       SN NUMBER(3);
       CH1 CHAR(3);
       ART   P_HW.PH_ART%TYPE;
       BEZ   P_HW.PH_BEZ%TYPE;
       LIEF  P_HW.PH_LIEF%TYPE;
       LIEF_DAT    P_HW.PH_LIEF_DAT%TYPE;
       FREIGAB_NR  P_HW.PH_FREIGAB_NR%TYPE;
       BEST_NR   P_HW.PH_BEST_NR%TYPE;
       BEM    P_HW.PH_BEM%TYPE;
       BEST_DAT    P_HW.PH_BEST_DAT%TYPE;
       FREIGAB_DAT  P_HW.PH_FREIGAB_DAT%TYPE;
       HERST    P_HW.PH_HERST%TYPE;
       PREIS    P_HW.PH_PREIS%TYPE;
       comp    number(2);  
     
     begin
      N:=:NEW.PH_ST;
       IF N <> 0 THEN
         begin
           FOR comp IN 1..N LOOP
             SELECT S_DR_K.NEXTVAL 
              INTO SN
              FROM DUAL;
             CH1:=LPAD(SN,3,'0');   
             ART := :NEW.PH_ART;
             BEZ := :NEW.PH_BEZ;
             LIEF := :NEW.PH_LIEF;
             LIEF_DAT := :NEW.PH_LIEF_DAT;    
             FREIGAB_NR := :NEW.PH_FREIGAB_NR;
             BEST_NR := :NEW.PH_BEST_NR;
             BEM := :NEW.PH_BEM;
             BEST_DAT := :NEW.PH_BEST_DAT;
             FREIGAB_DAT := :NEW.PH_FREIGAB_DAT;
             HERST := :NEW.PH_HERST;
             PREIS := :NEW.PH_PREIS;
     
            INSERT INTO PRINTER(P_NR, P_ART, P_BEZ, P_LIEF, P_LIEF_DAT, P_FREIGAB_NR, P_BEST_NR, P_BEM, P_BEST_DAT, P_FREIGAB_DAT, P_HERST, P_PREIS)
                        VALUES (CH1, ART, BEZ, LIEF, LIEF_DAT, FREIGAB_NR, BEST_NR, BEM,BEST_DAT, FREIGAB_DAT, HERST, PREIS);
           END LOOP;
         end;
        END IF;
     end;
    END;

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par argoet Voir le message
    Pourtant votre code indique "Before Insert"
    Merci pour votre intervention qui m´a donné certitude et confiance au niveau de l´idée, car avant votre intrevention j´etais entrain d´elaborer une autre idée avec les curseurs (trier + recuperer le dernier enregistrement la table P_HW dans un curseur ensuite, copier les données dans la table PRINTER)

    Ce que j´avais fait est tous simplement supprimer la formulaire de ces deux table (je travaille avec APEX 4.0) et les créer de nouveax.

    Maintenant tous fonctionne parfaitement.

    Il parait que apex ne reagit pas avec les changement sur les programmes qui sont effectuée apres la creation de la page d´interface graphique::: peut etre !!!

    Merci autre fois pour votre intervention.

  13. #13
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Vérifiez le contenu de ART (n'est il pas vide ?) car en l'etat votre code semble pourtant OK
    =====================================================

    J'ai fait un test avec vos scripts de création de table + le trigger (sans la contrainte "CON_P_US" ) et tout est OK
    Signé : Capitaine Jean-Luc Picard

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

Discussions similaires

  1. [MySQL] Insérer des données dans une table, mais ce n'est pas une table USER
    Par amerex dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/08/2008, 00h01
  2. Access: Insérer des données dans une table acces
    Par Malika_AL dans le forum VBA Access
    Réponses: 6
    Dernier message: 27/01/2008, 22h41
  3. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  4. [SQL] Insérer des données dans une table
    Par wonga dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 01/08/2007, 12h00
  5. Réponses: 4
    Dernier message: 19/09/2005, 15h59

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