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 d'insertion sur une vue


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut Trigger d'insertion sur une vue
    salut
    j'ai créé une table employer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table employer(empno number(4),empname varchar2(15),no_tel varchar2(10)
    ,date_naiss date,salaire number,deptno number);
    puis une table emp2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create table emp2 as select * from employer where empno> 100
    puis une vue comme un shéma global des deux tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create view v_emp
    as 
    select * from employer
    union all
    select * from emp2;
    puis j'ai créé un trigger pour faire l'insertion sur la vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create or replace trigger tr_insert 
    instead of insert on v_emp
     
    begin
      if :old.empno>100 then
        insert into emp2 values(:new.empno, :new.empname, :new.no_tel,:new.date_naiss, 
                                :new.salaire,:new.deptno);
      else
        insert into employer values(:new.empno, :new.empname, :new.no_tel,:new.date_naiss, 
                                :new.salaire,:new.deptno);
      end if;
    end;
    soit avec new ou old le résultat d'insertion est la même chose lorsque j'écris ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into v_emp values(500,'500','500','22-2-2009',500,500);
    empno = 500 , normalement l'insertion se fait sur la table emp 2
    mais il a fait sur la table employer malgré la condition est clair : if :old.empno>100

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    La variable :OLD n'est jamais valorisée avec un INSERT car elle ne peut exister.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    La variable :OLD n'est jamais valorisée avec un INSERT car elle ne peut exister.
    où ? dans le if ? if :old.empno>100 ?

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Je ne le vois nulle part ailleurs.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Par défaut
    dans ce trigger :old n'a aucun sens donc normalement si g bien compris
    tu dois ecrire :new.empno>100 dans la condition if.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    merci pour vos réponses
    je veux maintenant traiter un exception

    j' ai fait comme ça :
    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
    create or replace
    trigger tr_delete
    instead of delete on v_emp
    for each row
    begin
      if :old.empno > 100 then
        delete from emp2 where empno=:old.empno and empname=:old.empname and
                                no_tel=:old.no_tel and date_naiss=:old.date_naiss 
                                and salaire=:old.salaire and deptno=:old.deptno;
        else
        delete from employer where empno=:old.empno and empname=:old.empname and
                                no_tel=:old.no_tel and date_naiss=:old.date_naiss 
                                and salaire=:old.salaire and deptno=:old.deptno;
        end if;
     
        exception
        when no_data_found then
        dbms_output.put_line('numero non valide');
    end;
    j'ai essayé de supprimer une ligne qui n'existe pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from v_emp where empno=789;
    le message 'numero on valide' n'affiche pas
    où est l'erreur ??

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous vous moquez ou quoi ?
    On vous a dit que la pseudo variable :OLD n'est pas valorisée en INSERT. Il faut la remplacer par :NEW

    et puis, un delete ne génèrera jamais l'exception NO_DATA_FOUND

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

Discussions similaires

  1. [10g] Trigger de recopie sur une vue
    Par Jordel dans le forum PL/SQL
    Réponses: 2
    Dernier message: 12/03/2013, 17h14
  2. [MSSQL05] Archivage de données, trigger sur une vue
    Par tamiii dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2008, 13h54
  3. Réponses: 0
    Dernier message: 20/02/2008, 11h55
  4. TRIGGER sur une vue
    Par islamune9 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/09/2007, 17h32
  5. [Trigger] Comment le réaliser sur une vue ?
    Par mandale dans le forum DB2
    Réponses: 1
    Dernier message: 19/09/2005, 13h43

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