IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Updater une table xml


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 42
    Points : 35
    Points
    35
    Par défaut Updater une table xml
    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

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Le mieux serait de créer un trigger INSTEAD OF UPDATE et de déporter la logique de MAJ de votre vue dans ce déclencheur.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Au lieu de stocker le fichier XML extrayez de le début les données sous forme relationnelle dans une table à partir de ce fichier. Ensuite la mise à jour des données devient banale.

Discussions similaires

  1. updater une table avec un select distinct d'une autre
    Par SpaceFrog dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/10/2009, 19h28
  2. [AC-2002] Updater une table par rapport à une autre
    Par thierryakaguy dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 29/07/2009, 17h48
  3. VB2005] Update une table à partir d'une autre
    Par Herlece dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/01/2008, 18h44
  4. Réponses: 2
    Dernier message: 13/12/2007, 15h02
  5. [C#/ADO.NET] Comment Updater une table via Datagrid ?
    Par Pierre_45 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 06/07/2006, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo