Oracle : problème requête ! MERGE INTO [RESOL] 2 bugs Oracle de fou

Oracle : problème requête ! MERGE INTO [RESOL] 2 bugs Oracle de fou - SQL/NoSQL - Programmation

Marsh Posté le 30-08-2006 à 11:49:23    

Bonjour tout le monde,
 
Voila j'aimerais synchroniser 2 tables qui ne sont pas sur le même serveur par le bias du sql "merge into...". J'en ai fais auparavant tout ce passe bien mais sur cette requete j'ai un probleme ora-00904 : identificateur non valide
 
Pourriez vous m'aider ?
 
ma requete est du type :

Code :
  1. MERGE INTO t1.a@db1 a USING
  2. ( select tmp.id2,tmp.id,tmp.lib
  3.   from
  4.       (select x.id2,x.id,x.lib from t2.X x, t2.Y y WHERE x.id = y.id ) tmp,
  5.       t1.b@db1 b
  6.    where tmp.cond > n
  7.       and tmp.id = b.id
  8. ) t
  9. ON (a.id = t.id)
  10. WHEN MATCHED THEN UPDATE
  11. set a.lib = t.lib
  12. WHEN NOT MATCHED THEN INSERT (id,lib)
  13. values(sequence_x.nextval, t.lib)

ora-00904 : identificateur non valide
 
voila sauf que j'ai toujours mon message d'erreur concernant la jointure ON (a.id = t.id) L'identificateur non valide porte sur t.id de cette jointure  :heink:  
Je ne comprends pas mais alors pas du tout, surtout que j'ai déjà réalisé ce genre de requete ailleurs et que cela marche très bien  :sarcastic:.  
 
A savoir aussi que le select de la table source marche tres bien évidemment..  :wahoo:  
 
Si vous voyez l'erreur, le bug, ou si vous avez une précision un doute... n'hésitez pas  :jap:


Message édité par Yop69 le 30-08-2006 à 14:14:19
Reply

Marsh Posté le 30-08-2006 à 11:49:23   

Reply

Marsh Posté le 30-08-2006 à 12:25:39    

J'ai trouvé !!!!
Gros bug ou alors fonctionnement normal d'Oracle en tout cas c'est un truc de fou !!
 
Pour que la jointure se passe bien et que Oracle ne renvoie pas ora-00904 : identificateur non valide, il faut que dans le select le champ de jointure apparaisse en 1ier  :ouch:  :ouch: (tmp.id avant tmp.id2  :kaola: )
 
Un truc hallucinant, mais je suis trop content de l'avoir trouvé, sinon j'étais obligé de passer par une table temporaire (dans ce cas cela marche mais obligé d'utiliser un execute immediate ' merge into ..... ';
 
Solution :

Code :
  1. MERGE INTO t1.a@db1 a USING
  2. ( select tmp.id,tmp.id2,tmp.lib
  3.   from
  4.       (select x.id2,x.id,x.lib from t2.X x, t2.Y y WHERE x.id = y.id ) tmp,
  5.       t1.b@db1 b
  6.    where tmp.cond > n
  7.       and tmp.id = b.id
  8. ) t
  9. ON (a.id = t.id)
  10. WHEN MATCHED THEN UPDATE
  11. set a.lib = t.lib
  12. WHEN NOT MATCHED THEN INSERT (id,lib)
  13. values(sequence_x.nextval, t.lib)


Message édité par Yop69 le 30-08-2006 à 12:57:15
Reply

Marsh Posté le 30-08-2006 à 12:53:53    

Autre probleme maintenant, je dois remonter un champ dans le select d'une autre table (b) qui se nomment pareil (b.id). Bah quoique je fasse Oracle me fait une erreur ora-00918 : définition de colonne ambigu  :fou:  
J'hallucine la !!!!
Si je mets ma selection dans une vue : pareil !  
 
J'ai l'impression que ce merge into gère très mal les requetes sources qu'on peut lui passer (bug)
 

Code :
  1. MERGE INTO t1.a@db1 a USING
  2. ( select tmp.id as toto,tmp.id2,tmp.lib, b.id as titi
  3.   from
  4.       (select x.id2,x.id,x.lib from t2.X x, t2.Y y WHERE x.id = y.id ) tmp,
  5.       t1.b@db1 b
  6.    where tmp.cond > n
  7.       and tmp.id = b.id
  8. ) t
  9. ON (a.id = t.id)
  10. WHEN MATCHED THEN UPDATE
  11. set a.lib = t.lib
  12. WHEN NOT MATCHED THEN INSERT (id,lib)
  13. values(sequence_x.nextval, t.lib)

ora-00918 : définition de colonne ambigu


Message édité par Yop69 le 30-08-2006 à 12:55:47
Reply

Marsh Posté le 30-08-2006 à 14:13:40    

2ième feinte pour résoudre le 2ième bug : passer par une fonction ex nvl sur le champ selectionné posant un problème. Impressionant Oracle, c'est la première fois que je tombe sur du nimportenawak comme cela !  :heink:  
 
Solution :

Code :
  1. MERGE INTO t1.a@db1 a USING
  2. ( select tmp.id as toto,tmp.id2,tmp.lib, nvl(b.id,null) as titi
  3.   from
  4.       (select x.id2,x.id,x.lib from t2.X x, t2.Y y WHERE x.id = y.id ) tmp,
  5.       t1.b@db1 b
  6.    where tmp.cond > n
  7.       and tmp.id = b.id
  8. ) t
  9. ON (a.id = t.id)
  10. WHEN MATCHED THEN UPDATE
  11. set a.lib = t.lib, a.id = t.titi -- ATTENTION ICI BUG, ORACLE UPDATE AVEC t.toto !!!!!!!!!!!!!!!!!!
  12. WHEN NOT MATCHED THEN INSERT (id,lib)
  13. values(sequence_x.nextval, t.lib)


 
Bah non finalement ca empeche que Oracle gueule mais le merge se fait avec le 1ier id bien que j'ai mis tmp.id as toto et b.id as titi c'est tout le temps toto  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:


Message édité par Yop69 le 30-08-2006 à 14:37:52
Reply

Marsh Posté le 30-08-2006 à 14:45:49    

ORAKLE SAPUDUKU :o

Reply

Marsh Posté le 30-08-2006 à 18:35:06    

sous SQL*Plus on a un * sous la colonne qui pose problème... ce serait bien que tu fasses un copier/coller complet :)
 
betsamee -> c'est pour ça que c'est le leader mondial :D

Reply

Marsh Posté le 30-08-2006 à 18:58:35    

orafrance a écrit :


betsamee -> c'est pour ça que c'est le leader mondial :D


CAY LE LEADER MONDIAL DUKAKA OUI :o

Reply

Marsh Posté le 31-08-2006 à 16:48:40    

parole de noob :o  
 
:D

Reply

Marsh Posté le 31-08-2006 à 17:21:02    

[:sinking]

Reply

Marsh Posté le 04-09-2006 à 13:17:03    

mdr orafrance :D


Message édité par moonboot le 04-09-2006 à 13:18:19
Reply

Marsh Posté le 04-09-2006 à 13:17:03   

Reply

Marsh Posté le 13-06-2008 à 15:46:30    

J'ai un autre problème:
 
SQL> SELECT SDO_UTIL.APPEND(c_c.geom, c_a.geom)
  2  FROM scott.regionc c_c, scott.regionc c_a  
  3  WHERE c_c.name = 'TOSCANA' and c_a.name = 'UMBRIA';
WHERE c_c.name = 'TOSCANA' and c_a.name = 'UMBRIA'
                               *
ERREUR à la ligne 3 :
ORA-00904: "C_A"."NAME" : identificateur non valide
 
et aussi:
 
SQL> SELECT SDO_UTIL.APPEND(c_c.geom, c_a.geom)
  2  FROM scott.regionc c_a, scott.regionc c_c
  3  WHERE GRUPO=1;
WHERE GRUPO=1
      *
ERREUR à la ligne 3 :
ORA-00918: définition de colonne ambigu
 
aide s'il vous plaît!!!!!!!!!!!!!!!!!! :??:

Reply

Marsh Posté le 20-03-2015 à 21:09:12    

bonsoir, svp j'essaye de faire une mise à jour sur le nombre de pret d'un client lors de l'ajout d'une nouvelle location pour ce dernier.... mais j'ai obtenus ces erreurs :( :(  sachant que travaille sur oracle !!  
PL/SQL: ORA-00904: "FILM"."IDFILM" : identificateur non valide
3 1 PL/SQL: SQL Statement ignored
12 23 PL/SQL: ORA-00904: "FILM"."IDFILM" : identificateur non valide
9 1 PL/SQL: SQL Statement ignored
18 23 PL/SQL: ORA-00904: "FILM"."IDFILM" : identificateur non valide
15 1 PL/SQL: SQL Statement ignored
19 8 PL/SQL: ORA-00942: Table ou vue inexistante
19 1 PL/SQL: SQL Statement ignored
 
 
CREATE OR REPLACE TRIGGER  "MAJ_NB_FILM"  
BEFORE
insert or delete or update of numbonloc on location
for each row
begin
if inserting then
update client set nbrfilmpret = nbrfilmpret+1
where numbonloc = :new.numbonloc
and location.numc = client.numc
and location.idfilm = film.idfilm;
end if;
if deleting then
update client set nbrfilmpret = nbrfilmpret-1
where numbonloc = :old.numbonloc
and location.numc = client.numc
and location.idfilm = film.idfilm;
end if;
if updating then
update client set nbrfilmpret =  nbrfilmpret+1
where numbonloc = :new.numbonloc
and location.numc = client.numc
and location.idfilm = film.idfilm;
update loction set nbrfilmprete = nbrfilmprete-1
where numbonloc = :old.numbonloc
and location.numc = client.numc
and location.idfilm = film.idfilm;
end if;
end;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed