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
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    La variable :OLD n'est jamais valorisée avec un INSERT car elle ne peut exister.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Je ne le vois nulle part ailleurs.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 95
    Points
    95
    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
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 éminent sénior
    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
    Points : 11 862
    Points
    11 862
    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édacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 expérimenté 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
    Points : 1 332
    Points
    1 332
    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

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    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
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 éminent sénior
    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
    Points : 11 862
    Points
    11 862
    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.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  13. #13
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

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

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

    NB/ tu peux ne pas faire raise exception

  15. #15
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    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...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  16. #16
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Pouvez-vous re-donner le code complet ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  19. #19
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Points : 8
    Points
    8
    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 éminent sénior
    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
    Points : 11 862
    Points
    11 862
    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édacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

+ 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