Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/09/2006, 10h50   #1
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
Par défaut probleme de trigger

salut,

j'ai creer ce trigger
Code :
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 :
INSERT INTO test1 (clé,charcol) VALUES (1,'')
ça fonctionne pas et j'ai ce message d'erreur
Citation:
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 :
CREATE TABLE test1 (clé integer,charcol varchar(5) NOT NULL);
je comprend pas pourquoi ?
est ce que quelqu'un pourrait m'eclairer ?

Merci
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 11h44   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Le message d'erreur est pourtant clair : votre trigger est invalide.

Faites :
Code :
SHOW err TRIGGER xtest1
et vous devriez pouvoir comprendre votre problème.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 11h48   #3
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
ceci serait mieux:

Code :
1
2
3
IF :NEW.charcol IS NULL then
  :NEW.charcol := 'vide';
end IF;
__________________
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 11h54   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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 "
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 11h55   #5
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
je l'ai modifier comme cela et j'ai toujour le meme message d'erreur

Code :
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;
Citation:
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 ?
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 12h00   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
il compile pas ton trigger, avec quel outil tu le traites ? tu as mis " :NEW.charcol='v'; " au lieu de " :NEW.charcol:='v';"
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 12h03   #7
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
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
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 12h14   #8
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
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
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 12h24   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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)

remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 13h19   #10
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
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
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 15h14   #11
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
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 :
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

Citation:
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
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 15h38   #12
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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...

remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 15h41   #13
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
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 ?
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 16h01   #14
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
oui, à priori je vois pas comment tu pourrais faire autrement...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 16h06   #15
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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....
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 16h06   #16
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
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 ''.
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h37.


 
 
 
 
Partenaires

Hébergement Web