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 29/02/2008, 13h33   #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 d'insertion dans la base de données distante

Bonjour
je desirerai faire une insertion dans la table de données distante lorsque l'objet modifié dans ma table local , n'y existe pas , sinon ( s'il existe ) je le met a jour, voila mon trigger , je ne sais pas ou ca déconne
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR REPLACE TRIGGER trigger_codeb AFTER UPDATE OR INSERT ON SUPPORTE FOR
EACH ROW
DECLARE
sub_id VARCHAR(30);
existe
INTEGER:=0;
BEGIN
sub_id:=trouve_id_personne(:new.id_carte);
SELECT count(*)
INTO existe FROM asynchrone@exportSynchrone WHERE codebar= :old.codebar ;
IF
(sub_id IS NOT NULL) then
IF ( existe > 0) then
UPDATE
asynchrone@exportSynchrone SET  codebar= :new.codebar  WHERE codebar =
:old.codebar ;
else
INSERT INTO asynchrone@exportSynchrone
(codebar,id_personne,diffphoto) VALUES (:new.codebar
,substr(sub_id,1,(length(sub_id)-12)) ,'N');
COMMIT;
end IF;
end IF;
 END ;
avec
ma fonction :
Code :
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE FUNCTION trouve_id_personne(id_c VARCHAR2)
RETURN varchar2 IS 
id_p varchar(20);
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT id_personne INTO id_p FROM porteur, supporte WHERE porteur.id_carte=supporte.id_carte  AND porteur.id_carte= id_c;
RETURN id_p;
Exception
When NO_DATA_FOUND Then RETURN NULL;
END
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 13h36   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
C'est quoi l'erreur ?
Ton trigger est bien compilé ? Parce qu'un COMMIT dans un trigger c'est interdit.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 14h33   #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 , il est compilé , 0 erreur
quand je modifie une valeur qui n'existe pas dans la table distante , normaleme,t il doit l'inserer , or il le fait pas
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 14h41   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
il doit y avoir une erreur, comme c'est dit, commit dans trigger c'est pas possible
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 14h47   #5
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
j'execute la requete dans sql*plus , lorsque j'execute le trigger , on m'affiche :
comment faire pr qu'il detecte l'erreur ?
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 14h47   #6
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
Si cela peut vs aider , je ss sur Oracle 10g express
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 15h13   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
A part ça ton code n'est pas super optimisé non plus

Soit tu utilises MERGE soit un truc du style :
Code :
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE TRIGGER trigger_codeb AFTER UPDATE OR INSERT ON SUPPORTE FOR
EACH ROW
BEGIN
UPDATE asynchrone@exportSynchrone SET  codebar= :new.codebar  WHERE codebar =:old.codebar ;
IF SQL%ROWCOUNT=0 THEN 
INSERT INTO asynchrone@exportSynchrone
(codebar,id_personne,diffphoto) VALUES (:new.codebar
,substr(sub_id,1,(length(sub_id)-12)) ,'N');
end IF;
 END ;
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 16h30   #8
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
Merci pr le code optimisé
sinon une fois j'ai enlevé un test "con"
Code :
( IF sub_id IS NOT NULL )
il vient de detecter que commit doit pas etre la lol
bonne fin de soirée et merci encore
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 08h22.


 
 
 
 
Partenaires

Hébergement Web