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. #21
    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
    il n'affiche aucun message malgré il y a set serveroutput on
    je travaille sous sql dev
    il m'affiche rien , il execute la requete de suppression mais aucun message est affiché
    j'ai essayé sous sql*plus , rien aussi il me dit 0 lignes supprimées

    même chose soit avec if rowcount=0 then .....ou non

    il y a une erreur quelque part
    j'ai essayé une exemple pour assurer que le dbms_output marche bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    declare 
      vno number;
    begin
      select empno into vno from v_emp
      where empname='imh';
      exception
      when no_data_found then
      dbms_output.put_line('erreur erreur');
    end;
    il affiche le message sans problème

  2. #22
    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,
    voici mon 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
    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('aucune ligne supprimée ' || Sql%Rowcount);
      Else
        Dbms_Output.Put_Line(Sql%Rowcount || ' lignes supprimées');
      End If;
    End;
    si j'utilise ces données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    insert into EMP2 (EMPNO, EMPNAME, NO_TEL, DATE_NAISS, SALAIRE, DEPTNO)
    values (120, '120', '120', to_date('19-02-2009', 'dd-mm-yyyy'), 1500, 1);
    insert into EMPLOYER (EMPNO, EMPNAME, NO_TEL, DATE_NAISS, SALAIRE, DEPTNO)
    values (1, '1', '1', to_date('19-02-2009', 'dd-mm-yyyy'), 1500, 1);
    insert into EMPLOYER (EMPNO, EMPNAME, NO_TEL, DATE_NAISS, SALAIRE, DEPTNO)
    values (120, '120', '120', to_date('19-02-2009', 'dd-mm-yyyy'), 1500, 1);
    commit;
    j'aurais ces lignes au niveau de v_emp:

    EMPNO...EMPNAME...NO_TEL...DATE_NAISS...SALAIRE...DEPTNO
    1..........1..............1............19/02/2009.....1500........1
    120.......120...........120.........19/02/2009.....1500........1
    120.......120...........120.........19/02/2009.....1500........1

    ok j'usquà présent.

    si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> delete v_emp v where v.EMPNO = 1;
     
    1 lignes supprimées
     
    1 row deleted
    et si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL> delete v_emp v where v.EMPNO = 120;
     
    1 lignes supprimées
    aucune ligne supprimée 0
     
    2 rows deleted
    bon, peut être moi aussi j'ai pas bien compris ce résultat.
    A vous de jouer Mr Yerbouti, peut être tu as une explication

  3. #23
    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
    et ça affiche aussi trés bien
    la ligne bien sûr n'existe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    declare 
      vno number;
    begin
      delete from v_emp where empno=456;
      if sql%rowcount=0 then
        dbms_output.put_line('erreur erreur');
        end if;
     
    end;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM v_emp WHERE empno=456;
    n'affiche rien

  4. #24
    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
    bon, peut être moi aussi j'ai pas bien compris ce résultat.
    j'ai essayé ton trigger
    il m'affiche

    1 lignes supprimées
    0 lignes supprimées

    lorsque je supprime une ligne existe
    mais lorsque je veux supprimer une lignes qui n'existe pas il m'affiche rien
    pourquoi ???

  5. #25
    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
    Faut avouer que votre test est tordu. Si EMP > 100 alors vous supprimez dans EMP2, sinon dans EMPLOYEUR, hors vous n'avez qu'une seule ligne à EMP=120 dans la table EMP2....

    Peut-être pourriez-vous faire vos armes avec des cas plus simples....
    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

  6. #26
    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
    j'ai utilisé ce trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create or replace trigger tr_delete
    instead of DELETE ON v_emp 
    FOR each row
    Begin
      Dbms_Output.Put_Line('xxxx');
    End;
    et si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    delete v_emp v where v.EMPNO = 1200;
     
    0 rows deleted
    je crois que le trigger ne se déclenche pas dans le cas où il n'y a aucune ligne à supprimer de la vue.
    je ne suis pas sûr de cette information mais d'après le résultat!!!!

  7. #27
    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
    je pense que la discussion est compliquée

    on revient à le probème principal

    pourquoi ça affiche le message

    declare
    vno number;
    begin
    DELETE FROM v_emp WHERE empno=456;
    IF sql%rowcount=0 then
    dbms_output.put_line('erreur erreur');
    end IF;

    end;
    et ça non

    DELETE FROM v_emp WHERE empno=456;
    il y a le trigger de suppression contient

    IF sql%rowcount=0 then
    dbms_output.put_line('erreur erreur');
    end IF;

  8. #28
    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
    0 rows deleted affiche soit il y a un trigger ou non

    je pense que oui , c'est pourquoi il m'affiche pas le message si je veux supprimer une ligne qui n'existe pas non ??

  9. #29
    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
    "0 rows deleted" c'est ORACLE qui l'affiche mais ton message ne s'affiche pas car il n'y a aucune ligne à supprimer de la vue qui va obliger ton trigger à se déclencher.
    ok?

  10. #30
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par Cirtadz Voir le message
    je pense que la discussion est compliquée

    on revient à le probème principal

    pourquoi ça affiche le message



    et ça non



    il y a le trigger de suppression contient
    Pourquoi voulez-vous mettre un dbms_output dans un trigger?

  11. #31
    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 discussion est effectivement compliquée car à chaque fois, vous introduisez une partie de code différente. Désolé, mais je me retire ...
    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

  12. #32
    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
    "0 rows deleted" c'est ORACLE qui l'affiche mais ton message ne s'affiche pas car il n'y a aucune ligne à supprimer de la vue qui va obliger ton trigger à se déclencher.
    ok?
    c'est que je cherche , le trigger ne déclenche pas s'il y a pas une ligne
    delete from v_emp where empno= 456 , 456 n'existe pas donc aucun utilité de mettre une exception qui va traiter ce cas
    Citation Envoyé par GoLDoZ Voir le message
    Pourquoi voulez-vous mettre un dbms_output dans un trigger?
    pour traiter mon exception

  13. #33
    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 discussion est effectivement compliquée car à chaque fois, vous introduisez une partie de code différente. Désolé, mais je me retire ...
    Why ?

    je veux seulement que si la ligne à supprimer n'existe pas , il m'affiche un message perso

  14. #34
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Mettre un dbms_output dans un trigger n'est pas très propre. Et je ne suis pas sûr que la sortie dbms d'un trigger se situe au niveau de la procédure.

    La vraie question est de savoir si un trigger INSTEAD OF DELETE se déclenche s'il n'y a aucune ligne à supprimer. Un rapide test permettrait de le savoir.


    EDIT: je viens de faire le test avec trigger AFTER DELETE. Le dbms s'affiche bien dans le cas où il y a une ligne à supprimer. Rien dans le cas de 0 ligne.
    Idem pour un BEFORE DELETE.

    Il semblerait donc qu'avant de déclencher un trigger, Oracle vérifie s'il y a vraiment une insertion/suppression/mise à jour à faire.
    Je ne peux tester avec un INSTEAD OF, mais je ne vois pas de raison pour que cela fonctionne différemment.

  15. #35
    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
    Vu qu'il s'agit d'une trigger FOR EACH ROW, il se déclenchera sur toute ligne pouvant être supprimée. Il est donc évident qu'il ne se déclenchera pas si aucune ligne ne peut être supprimée.
    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. #36
    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 GoLDoZ Voir le message
    Mettre un dbms_output dans un trigger n'est pas très propre. Et je ne suis pas sûr que la sortie dbms d'un trigger se situe au niveau de la procédure.

    La vraie question est de savoir si un trigger INSTEAD OF DELETE se déclenche s'il n'y a aucune ligne à supprimer. Un rapide test permettrait de le savoir.
    je doute sur ça, je pense qu'il ne déclenche pas, donc pas besoin de traiter une exception

    pour l'insertion je vais essayer

  17. #37
    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
    Vu qu'il s'agit d'une trigger FOR EACH ROW, il se déclenchera sur toute ligne pouvant être supprimée. Il est donc évident qu'il ne se déclenchera pas si aucune ligne ne peut être supprimée.
    même sans for each roc ne déclenchera pas

  18. #38
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Conclusion: vous devez traiter cette exception dans votre procédure principale et non dans le trigger.

  19. #39
    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
    je crois que le problème est résolu mainant.

  20. #40
    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
    oui merci mais j'ajoute autre problème
    le trigger update ne fonctionne pas
    je ne trouve aucune erreur

    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
    create or replace
    trigger tr_update
    instead of update on v_emp
    for each row
    begin
      if :old.empno > 100 then
        update emp2 set empname=:new.empname,no_tel=:new.no_tel, date_naiss=:new.date_naiss,
                salaire=:new.salaire, deptno=:new.deptno
                where empno=:old.empno;
        else
        update employer set empname=:new.empname,no_tel=:new.no_tel, date_naiss=:new.date_naiss,
                salaire=:new.salaire, deptno=:new.deptno
                where empno=:old.empno;
        end if;
    end;

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 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