Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 04/03/2008, 16h21   #1
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
Par défaut probleme de mise a jour bd distante

Bonsoir,
lorsque j'essaie de modifier un champ pr la premiere fois , le trigger marche a merveille, mais dés que j'essaie de modifier le meme champ pour la 2eme fois , cette erreur surgit :
Code :
1
2
3
4
5
ORA-00001: violation de contrainte UNIQUE (UNI.SYS_C0010539)
ORA-02063: prÚcÚdant line de EXPORTSYNCHRONE
ORA-06512: Ó "UNI.TRIGGER_CHAMPS", ligne 11
ORA-04088: erreur lors d'exÚcution du dÚclencheur
'UNICAMPUS.TRIGGER_CHAMPS'
et voila le trigger
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE TRIGGER trigger_champs BEFORE UPDATE OR INSERT ON PERSONNES FOR EACH ROW
DECLARE
compt INTEGER;
valeur VARCHAR(10);
BEGIN
 IF (:new.diffphoto = '1') then valeur:='O' ;
 else valeur:='N';
 end IF;
compt:= SQLROWCOUNT(:new.id_personne) ;
UPDATE asynchrone@exportSynchrone SET diffphoto = valeur  ,date_maj= NVL( :new.date_maj, NVL( :new.dat_creation, '01/01/1999')) WHERE id_personne= substr( :new.id_personne ,1,(length( :new.id_personne )-12)) ; IF  compt = 0 then 
INSERT INTO asynchrone@exportSynchrone (diffphoto ,date_maj,id_personne)   VALUES (valeur  ,NVL(:new.date_maj, NVL(:new.dat_creation, '01/01/1999')) ,substr(:new.id_personne,1,(length(:new.id_personne)-12)) ) ;   
end IF ; 
END ;
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 16h48   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Tu essayes d'insérer 2 fois le même enregistrement.

Pour débugguer faut faire des dbms_output pour savoir où tu passes et vérifier pourquoi.

Code :
1
2
3
4
5
6
7
8
9
compt:= SQLROWCOUNT(:new.id_personne) ;
>A quoi ça sert ?
 
UPDATE asynchrone@exportSynchrone SET diffphoto = valeur  ,date_maj= NVL( :new.date_maj, NVL( :new.dat_creation, '01/01/1999')) WHERE id_personne= substr( :new.id_personne ,1,(length( :new.id_personne )-12)) ; 
 
IF  compt = 0 then 
> Non, c'est le SQL%rowcount de l'UPDATE qui te dira si tu AS mis à jour une ligne ou pas.
 
INSERT INTO asynchrone@exportSynchrone (diffphoto ,date_maj,id_personne)   VALUES (valeur  ,NVL(:new.date_maj, NVL(:new.dat_creation, '01/01/1999')) ,substr(:new.id_personne,1,(length(:new.id_personne)-12)) ) ;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 17h47   #3
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
oui j'ai fait un dbms , meme si j'insere , le sql%rowcount me renvoi 0 , meme si l'enregistrement existe bel et bien dans la table
le sqlrowcount , c'est une fonction que j'ai defini , ca ressemble un peu a sql%rowcount , parce que au debut j'ai cru que c'est sql%rowcount qui fonctionne pas.. on dirait que j'ai besoin d'un commit
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 17h53   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
je vais tester par dblink.

Sinon utilises MERGE si tu es en 9i et +, ça regroupe UPDATE/INSERT
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 17h56   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Ca marche très bien par dblink :
Code :
1
2
3
4
5
6
7
8
9
BEGIN
	UPDATE MATABLE@DBLINK1
    SET dept = '01'
    WHERE dept = '01'
    AND ROWNUM < 3;
    DBMS_OUTPUT.PUT_LINE('Nb update : '|| SQL%rowcount);
END;
 
Nb UPDATE : 2
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 17h59   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE TRIGGER trigger_champs 
BEFORE UPDATE OR INSERT ON PERSONNES 
FOR EACH ROW
DECLARE
BEGIN
 
    UPDATE asynchrone@exportSynchrone 
    SET diffphoto = DECODE(:NEW.diffphoto,'1', 'O', 'N'), 
    	date_maj= NVL(:NEW.date_maj, NVL(:NEW.dat_creation, '01/01/1999')) 
    WHERE id_personne= SUBSTR(:NEW.id_personne ,1,(LENGTH(:NEW.id_personne )-12));
 
    IF SQL%ROWCOUNT = 0 
    THEN 
	INSERT INTO asynchrone@exportSynchrone (diffphoto ,date_maj,id_personne)   
        VALUES (DECODE(:NEW.diffphoto,'1', 'O', 'N'), 
        	NVL(:NEW.date_maj, NVL(:NEW.dat_creation, '01/01/1999')),
                SUBSTR(:NEW.id_personne,1,(LENGTH(:NEW.id_personne)-12)) );   
    END IF; 
END;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 18h06   #7
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
je sais , toute a l'heure lorsque j'ai fait le database link vers ma base de données locale ( j'ai consideré que ma bd localeest la bd distante ) tout marche a merveille , mais une fois j'ai voulu le tester sur une vraie bd distante , on dirait qu'il ne prend pas en considerations les insert faites auparavant
c'est due a quoi ? mon trigger est correct ,enfin je pense ..
est ce qu'il ya une "refresh" en oracle ?comme ca le sql%rowcount maffichera le bon resultat et non pas 0 , meme s'il existe bien des elements ajoutés dans la table distante
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 18h14   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Non. SQL%rowcount t'indiques le nb de lignes traitées.
Par contre faut le faire juste après l'ordre sql.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 18h17   #9
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
oui je l'ai fait et ca marche tjrs pas
mais prq cela marche en locale et ca marche plus lorsque je me suis connectée a une base "réellement"distante ? normalement c'est la meme chose ou non ?
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h33.


 
 
 
 
Partenaires

Hébergement Web