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 05/03/2008, 09h29   #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 passer du insert/update à MERGE

Bonjour ,
je voudrais passer de ca :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
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;
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  SQL%ROWCOUNT = 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 ;
a MERGE , parce que sql%rowcount me renvoit tjrs la valeur 0 , meme si je viens de faire un insert
comment le faire ?
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 09h35   #2
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
Citation:
Envoyé par zaineb.z Voir le message
a MERGE , parce que sql%rowcount me renvoit tjrs la valeur 0 , meme si je viens de faire un insert
comment le faire ?
Je dirais même que SQL%ROWCOUNT est forcément égal à 0 si tu fais l'insertion... vu que c'est la condition

Vérifie que le WHERE est correct avec un SELECT
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 09h47   #3
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
le where est bon et puis , vous savez, quand je defini ma base locale en tant que bd distante , tout marche a merveille , je sais pas pourquoi ca deconne
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 10h37   #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
tu es sûr que le WHERE est sensé récupérer des lignes sur la base distante ? T'as des doublons sur la base distante qui permettraient de démontrer qu'il y a bien un INSERT au lieu d'un UPDATE ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 11h27   #5
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
au faite , c'est bizarre mais bon.. lorsque je supprime un autre trigger qui se declenche en meme evenement declencheur du trigger "trigger_champs" tout marche tres bien.
comment faire pr "synchroniser" le fonctionnement des deux triggers? a titre d'information : ils agissent sur la meme table avec les memes evenements declencheurs .
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 11h37   #6
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
et on devine le code pour trouver le problème ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 12h06   #7
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
voila , j'ai changé mon trigger , voila le nouveau code mais tjrs la meme erreur
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
25
26
CREATE OR REPLACE TRIGGER trigger_champs BEFORE UPDATE OR INSERT ON PERSONNES
FOR EACH ROW
DECLARE
compt INTEGER;
valeur VARCHAR(10);
pic BLOB;
stockage varchar(20):='ok';
BEGIN
 IF
(:new.diffphoto = '1') then valeur:='O' ;
 else valeur:='N';
 end IF;
 pic :=
photo(:new.id_personne);
 compt:=mySqlrowcount(substr(:new.id_personne,1,(length( :new.id_personne)-12)));
 IF compt >0 then UPDATE
asynchrone@synchrone 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)) ; 
else 
INSERT INTO asynchrone@synchrone (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 ;
IF stockage IS NOT NULL then 
UPDATE asynchrone@synchrone SET  stockage_photo= pic  WHERE id_personne =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 05/03/2008, 12h15   #8
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
Crée ce trigger à la place du tient :
Code :
1
2
3
4
5
6
CREATE OR REPLACE TRIGGER trigger_champs BEFORE UPDATE OR INSERT ON PERSONNES
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE(:new.id_personne);
END;
/
Ensuite pour tester ta requête :
Code :
1
2
3
SET SERVEROUTPUT ON
INSERT INTO personnes [ce qui va bien]
SELECT * FROM asynchrone@synchrone WHERE id_personne= substr( '&idpersonne',1,(length( '&idpersonne' )-12)) ;
en indiquand un l'idpersonne qui est affiché au moment de l'insert.

Je sens bien le :new.id_personne au lieu de :old.id_personne... avec ta version de trigger le id_personne est bien non nulle dans la table distante ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 12h18   #9
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
non elle n'est pas null , c'est un champ clé
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 12h24   #10
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 continues à utiliser mySqlrowcount...
Donne le code de cette fonction..
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 12h30   #11
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
mySqlrowcount :
Code :
1
2
3
4
5
6
7
 
CREATE OR REPLACE FUNCTION mySqlrowcount(id_p VARCHAR2) RETURN INTEGER IS 
compt INTEGER;
BEGIN 
SELECT count(id_personne) INTO compt FROM asynchrone@synchrone WHERE id_personne= id_p;
RETURN compt;
END ;
sinon voila le resultat du test que tu m'as demandé de faire orafrance :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SQL> INSERT INTO personnes
  2  SELECT * FROM asynchrone@synchrone WHERE id_personne= '&idpersonne';
Entrez une valeur pour idpersonne : 1010
ancien   2 : SELECT * FROM asynchrone@synchrone WHERE id_personne= '&idpersonne'
 
nouveau   2 : SELECT * FROM asynchrone@synchrone WHERE id_personne= '1010'
INSERT INTO personnes
            *
ERREUR Ó la ligne 1 :
ORA-00947: nombre de valeurs insuffisant
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 13h07   #12
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
Pour l'erreur Orafrance à noté [ce qui va bien], à toi de mettre les bonnes colonnes !!

Sinon, essayes ceci
Code :
1
2
3
4
5
6
7
8
9
10
 
BEGIN
INSERT INTO asynchrone@synchrone (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)) );
EXCEPTION WHEN DUP_VAL_ON_INDEX
THEN 
UPDATE
asynchrone@synchrone 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)) ;
END;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 13h13   #13
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
yupi yupi ca marche , merci bcp bcp a vous deux vs m'avez sauvé la vie merci et bonne journée
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 13h19   #14
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
voila le nouveau trigger
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
25
26
27
28
CREATE OR REPLACE TRIGGER trigger_champs BEFORE UPDATE OR INSERT ON PERSONNES
FOR EACH ROW
DECLARE
compt INTEGER;
valeur VARCHAR(10);
foto
varchar(10):='ok';
pic BLOB;
BEGIN
 IF (:new.diffphoto = '1') then valeur:='O'
;
 else valeur:='N';
 end IF;
 pic := photo(:new.id_personne);
 
compt:=mySqlrowcount(substr( :new.id_personne,1,(length(
:new.id_personne)-12)));
 
INSERT INTO asynchrone@synchrone (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)) );
EXCEPTION WHEN DUP_VAL_ON_INDEX
THEN 
UPDATE
asynchrone@synchrone 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)) ;
UPDATE asynchrone@synchrone SET  stockage_photo= pic  WHERE
id_personne =substr( :new.id_personne ,1,(length( :new.id_personne )-12));  
END ;
mais prk il met pas a jour le champ stockage_photo aussi?? je le vois NULL alors que :new.stockage_photo n'est pas NULL
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 13h42   #15
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
faut chercher un peu.

Regardes ton code, épure un peu les trucs inutiles (variable compt par exemple), et ça te sautera aux yeux.

Pour info, le BLOB ne peut pas passer par DBLINK (sauf dans le cas d'un CREATE TABLE AS SELECT il me semble)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 13h57   #16
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
la maj passe du champ stockage_photo passe bien lorsque j'ai definis la base locale en tant que base distante , ca doit etre la meme chose je pense que lorsque je definis la base distante vraiment " distante" et non pas locale non?
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 14h05   #17
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
quel est le type de stockage_photo ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 14h35   #18
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
il est de type BLOB ,
je tiens a signaler que la mise a jour passe trés bien lorsque j'ai definis la base locale en tant que base distante
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 15h36   #19
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
au faite , y aurait il une autre methode pr se connecter a une bd distante autre que batabase link ?
j'ai trouvé sur formu ceci :
Citation:
I think that the data have to be parsed into varchar2 in 32k sizes, and assembled at the other end. I am just not exactly sure, how to do the join on the other side of the db link, but a stored procedure could take care of this problem.
une idée ?
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 18h40.


 
 
 
 
Partenaires

Hébergement Web