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 :

probleme de trigger


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut probleme de trigger
    salut,

    j'ai creer ce trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace trigger xtest1 
    before insert on  test1
    for each row
    begin
    if :NEW.charcol='' then
    test1.charcol:='vide';
    end if;
    end;
    donc si il trouve '' dans mon insert , il le remplace par vide.
    Mais que je fais un insert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into test1 (clé,charcol) values (1,'')
    ça fonctionne pas et j'ai ce message d'erreur
    Error starting at line 1 in command:
    insert into test1 (clé,charcol) values (1,'')
    Error at Command Line:1 Column:12
    Error report:
    SQL Error: ORA-04098: trigger 'ZIP.XTEST1' is invalid and failed re-validation
    voici le script de ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create table test1 (clé integer,charcol varchar(5) not null);
    je comprend pas pourquoi ?
    est ce que quelqu'un pourrait m'eclairer ?

    Merci

  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
    Points : 3 609
    Points
    3 609
    Par défaut
    Le message d'erreur est pourtant clair : votre trigger est invalide.

    Faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    show err trigger xtest1
    et vous devriez pouvoir comprendre votre problème.

  3. #3
    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
    ceci serait mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if :NEW.charcol IS NULL then
      :NEW.charcol := 'vide';
    end if;

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    bon je sais, tu vas encore être dégouté, mais je pense que j'ai l'explication à ton problème....

    Comme tu le sais (et que tu le déplore...) '' veux dire null pour un varchar, et comme le test "machin = null" renvoi toujours faux en oracle,

    -> le test ":NEW.charcol='' " renverra toujours FAUX, il faut donc le remplacer par "":NEW.charcol is null "

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    je l'ai modifier comme cela et j'ai toujour le meme message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace trigger xtest1 
    before insert on  test1
    for each row
    begin
    if :NEW.charcol='x' then
    :NEW.charcol='v';
    end if;
    end;
    Error starting at line 1 in command:
    insert into test1 (clé,charcol) values (1,'x')
    Error at Command Line:1 Column:12
    Error report:
    SQL Error: ORA-04098: trigger 'ZIP.XTEST1' is invalid and failed re-validation
    en theorie quand il trouve x il insere v à la place mais il n'y arrive pas ?

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    il compile pas ton trigger, avec quel outil tu le traites ? tu as mis " :NEW.charcol='v'; " au lieu de " :NEW.charcol:='v';"

  7. #7
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    ouai exact c'etait le :=; merci
    et j'ai essayer avec is null et sa fonctionne
    et je crois que tu a raison sa vien du '' comme il le considere comme un null bin sa bogue
    dommage j'aurai essayer

  8. #8
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    supposons que je veuille ajouter une chaine de caractere = à ''
    je peu faire cela
    sous oracle quelle est le caractere echapatoire ?
    parceque quand je fais cela je n'ai qu'une seule quote à l'affichage au lieu de 2

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    c'est comme en basic, il faut doubler les cotes pour qu'il n'y en ai qu'une donc pour qu'il en insère 2, il faut que tu en mettes 4 (+ les 2 délimteurs = 6)


  10. #10
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    ok je te remercie
    c'etait bien cela
    et c'est possible à ton avis de faire un :NEW.*, pour lui dire de prendre tous les champs ou de lui specifier que les champs qui on la contrainte not null ?
    si c'est le cas j'aimerai bien le faire dans mon trigger

  11. #11
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    j'ai modifier mon trigger pour qu'il soit dynamique;donc j'ai mis un curseur dedans afin de faire une requete et recuperer le nom des champs qui sont à not null mais ça bogue

    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 xtest1 
    before insert on  test1
    for each row
    declare
    cursor curs is select table_name,column_name,nullable from user_tab_columns where table_name='TEST1';
    cursi curs%rowtype;
    begin
    for cursi in curs loop
     if cursi.nullable='N' then
    dbms_output.put_line('hello');
      if length(:NEW.column_name)>0 then
        :NEW.column_name:=:NEW.column_name;
      else
        :NEW.column_name:='''''';
      end if;
     end if;
    end loop;
    end;
    j'ai cette erreur
    je vois ce qui est pas valide

    Error starting at line 1 in command:
    insert into test1 (clé,charcol) values (3,' ')
    Error at Command Line:1 Column:12
    Error report:
    SQL Error: ORA-04098: trigger 'ZIP.XTEST1' is invalid and failed re-validation

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Y'a de l'idée mais ça ne peux pas marcher parcque tu fais une allocation dynamique de ton nom de colonne :NEW, ce que PL/SQL ne prends pas en compte...

    à priori je sèche, je vois pas comment ça serait possible de faire du dynamique dans ce genre de chose...


  13. #13
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    donc comme j'utilise :NEW je suis obliger de lui mettre le nom de la colonne en dure juste apres et pas le nom de la colonne que je recupere à l'aide de mon curseur.
    c'est bien cela ?

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    oui, à priori je vois pas comment tu pourrais faire autrement...

  15. #15
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Quoi que, y'a toujours moyen en montant une usine à gaz mais bon...

    A l'extrème limite, tu pourrais faire une fonction qui te génère ton code de création de trigger à passer à chaque fois que tu modifie la structure des tables....

  16. #16
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    mes donnée je les recupere d'un fichier
    donc dans le fichier j'aurai des champs à null et des champs à '' , d'atre à ' '...
    et d'autre avec des valeurs
    donc le length(:NEW.column_name)=0 quand j'aurai un null et '' si je reflechis bien;donc au final dans oracle mes null et '' de mon fichier seront des ''.

Discussions similaires

  1. probleme de trigger
    Par [ME]yeye dans le forum Oracle
    Réponses: 6
    Dernier message: 15/06/2006, 15h33
  2. Problème comportement trigger
    Par ameno_123 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/05/2006, 00h20
  3. Probleme de trigger
    Par Lomme dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 09/03/2006, 10h39
  4. Probleme de trigger
    Par luciemacherie dans le forum Oracle
    Réponses: 4
    Dernier message: 16/01/2006, 17h21
  5. [JDBC]Probleme avec trigger Oracle
    Par aurel89 dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2005, 11h53

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