Bonjour à tous et à toutes,

Voici mon soucis :

J'ai une table issue d'un fichier xml que je génére de la sorte :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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