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

  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

  8. #8
    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
    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
    j'ai déja remplacé le old par new

    ça c'est le trigger de suppression

    quel exception il génère ?
    même si j'ai ajouté when others , aucun message affiche
    comment traiter les exceptions donc sur mon trigger ?

  9. #9
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Citation Envoyé par Cirtadz Voir le message
    j'ai déja remplacé le old par new

    ça c'est le trigger de suppression

    quel exception il génère ?
    même si j'ai ajouté when others , aucun message affiche
    comment traiter les exceptions donc sur mon trigger ?

    pour le trigger instead delete c'est bien :OLD et non :new

    sinon

    essaie sql%notfound a la place de no_data_found et c'est un IF et non une exception



    le plus simple c'est de renvoyer un raise exception personnalisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if sql%notfound then ...
    http://download.oracle.com/docs/cd/B...htm#LNPLS00701

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Par défaut
    Bonjour,
    pour récupérer le nombre des lignes "touchées" par UPDATE ou DELETE utilise SQL%ROWCOUNT après chaque ordre.

    NB/ je ne c pas exactement si tu peux avoir un affichage sur écran à partir d'un trigger

  11. #11
    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 fatsora Voir le message
    pour le trigger instead delete c'est bien :OLD et non :new

    sinon

    essaie sql%notfound a la place de no_data_found et c'est un IF et non une exception



    le plus simple c'est de renvoyer un raise exception personnalisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if sql%notfound then ...
    http://download.oracle.com/docs/cd/B...htm#LNPLS00701
    j'ai déja essayé , il ne marche pas

    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
    create or replace trigger tr_delete
    instead of delete on v_emp
    for each row
    declare
    exp exception;
    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;
       if sql%notfound then 
       raise exp;
       end if;
        exception
        when exp then
        dbms_output.put_line('immmmmm');
    end;

  12. #12
    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
    c'est la variable SQL%ROWCOUNT qui faut tester. Elle contient le nombre d'enregistrements mis à jours par le dernier ordre SQL.

  13. #13
    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
    c'est la variable SQL%ROWCOUNT qui faut tester. Elle contient le nombre d'enregistrements mis à jours par le dernier ordre SQL.
    tu peux me dit le code
    j'ai essayé mais il ne marche pas

    if sql%rowcount ........ then raise mon_exp

    !!!

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Par défaut
    if sql%rowcount = 0 then
    traitement
    end if;

    NB/ tu peux ne pas faire raise exception

  15. #15
    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
    Citation Envoyé par Cirtadz Voir le message
    tu peux me dit le code
    j'ai essayé mais il ne marche pas

    if sql%rowcount ........ then raise mon_exp

    !!!
    ...Elle contient le nombre d'enregistrements mis à jours ...
    Il me semblait que c'était suffisament clair...

  16. #16
    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 guizaniseifislam Voir le message
    if sql%rowcount = 0 then
    traitement
    end if;

    NB/ tu peux ne pas faire raise exception
    ne marche pas soit à l'intérieur de bloc if ou en dehors

    lorsque je veux supprimer une ligne qui n'existe pas il m'affiche rien > ne traite pas l'exception

  17. #17
    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
    Il me semblait que c'était suffisament clair...
    je sais que c'est clair mais j'ai dit , il ne marche pas

  18. #18
    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
    Pouvez-vous re-donner le code complet ?

  19. #19
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    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 or replace TRIGGER tr_delete
    instead of DELETE ON v_emp
    FOR each row
    declare
      exp exception;
    begin
     
       IF :old.empno > 100 then
        DELETE FROM emp2 WHERE empno=:old.empno;
        else
        DELETE FROM employer WHERE empno=:old.empno;
        end IF;
        if sql%rowcount=0 then
        dbms_output.put_line('erreur');
        end if;
       end;

  20. #20
    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
    Ok, ça parait bien. N'oubliez pas de faire SET DBMSOUTPUT ON sous Sql*Plus avant de lancer votre ordre de suppression, sinon vous ne verrez aucun message. Je conseillerai aussi de sortir un autre message dans le ELSE du dernier IF pour être sur que vous affichez quelque chose.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

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