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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    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
    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)

  3. #3
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    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 confirmé

    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
    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 ?

  5. #5
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    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 confirmé

    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
    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');

+ 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