Bonjour à tous et à toutes,
Voici mon soucis :
J'ai une table issue d'un fichier xml que je génére de la sorte :
	
	Insert into TMP_XML_CATEGORIES values(XMLTYPE(bfilename('FICHIER_IN_FB', 'categories.xml'), nls_charset_id('AL32UTF8')));
 Pour pouvoir travailler sur cette table je génére une vue :
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   |  
CREATE OR REPLACE VIEW CAT_CATEGORIES AS
 SELECT x.*
       FROM  XMLTABLE (XMLNAMESPACES(
                                    DEFAULT 'http://api.bilboul.fr/bol/v1/categories'),
                                    'for $i in ora:view("TMP_XML_CATEGORIES")/categories/category
                                     return element r
                                     {
                                           $i/@id,
                                           $i/label
                                     }'
                      COLUMNS 
                              CAT_ID VARCHAR2(30) PATH '@id',        
                              CAT_LABEL VARCHAR2(20) PATH 'label'
                             ) x; | 
 Tous les matins, je dois mettre à jour les données en fonction d'un fichier XML déposé sur le serveur.
Pour celà, je veux utiliser :
	
	1 2 3 4 5 6 7
   |  
 
MERGE INTO TMP_XML_CATEGORIES
 
WHEN MATCHED UPDATE...
 
WHEN NOT MATCHED INSERT...  | 
 Mais comme la table TMP_XML_CATEGORIES ne contient qu'une ligne et q'une colonne :  le fichier xml, je ne peux pas requêter dessus.
J'ai essayé de faire ça : 
	
	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 29 30 31 32 33 34
   | MERGE INTO TMP_XML_CATEGORIES t
USING 
(
  SELECT *
  FROM XMLTABLE
  ( 
   'categories'
   passing v_xml
   columns CAT_ID VARCHAR2(32) PATH '@id',   
           CAT_LABEL VARCHAR2(20) PATH 'label'
  )
) r
ON (r.cat_ID =  (SELECT x.cat_id
                 FROM  XMLTABLE (XMLNAMESPACES(
                                    DEFAULT 'http://api.boulbil.fr/bol/v1/categories'),
                                    'for $i in ora:view("TMP_XML_CATEGORIES")/categories/category
                                     return element r
                                     {
                                           $i/@id,
                                           $i/label
                                     }'
                      COLUMNS 
                              CAT_ID VARCHAR2(32) PATH '@id',        
                              CAT_LABEL VARCHAR2(20) PATH 'label'
                             )x))
 
WHEN MATCHED THEN
  UPDATE SET t.CAT_LABEL = r.cat_label
 
WHEN NOT MATCHED THEN
  INSERT (CAT_ID,CAT_LABEL)
  VALUES (r.CAT_ID, r.cat_label);
 
end; | 
 Mais ça fonctionne pas. Dans l'absolu, je pourrai créer une table standard pour passer de TMP_XML_CATEGORIES à TBL_Categories et là je pourrai requêter dessus mais pour des raisons de performance, nous gardons la vue.
Savez-vous comment faire ou avez vous une piste de réflexion ?
Merci d'avance
						
					
Partager