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 Procédural MySQL Discussion :

Trigger function update sur champs XML


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut Trigger function update sur champs XML

    Bonjour a tous

    alors voila,
    une table biblioitems
    dans cette table un champs
    marcxml

    le contenu de ce champs:

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    | <?xml version="1.0" encoding="UTF-8"?>
    <record
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standa           rds/marcxml/schema/MARC21slim.xsd"
        xmlns="http://www.loc.gov/MARC21/slim">
     
    | <?xml version="1.0" encoding="UTF-8"?>
    <record
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
        xmlns="http://www.loc.gov/MARC21/slim">
     
      <leader>01331ntm a22003257a 4500</leader>
      <controlfield tag="001">.b21442988</controlfield>
      <controlfield tag="003">ES-BaCBU</controlfield>
      <controlfield tag="008">980309s1997    spcad  | m    000 ||spa|c</controlfield>
      <datafield tag="017" ind1=" " ind2=" ">
        <subfield code="a">B.38094-2009</subfield>
      </datafield>
      <datafield tag="020" ind1=" " ind2=" ">
        <subfield code="a">9788469256299</subfield>
      </datafield>
      <datafield tag="035" ind1=" " ind2=" ">
        <subfield code="a">C144736560</subfield>
        <subfield code="9">ES-BaCBU001</subfield>
      </datafield>
      <datafield tag="035" ind1=" " ind2=" ">
        <subfield code="a">1447-36560</subfield>
        <subfield code="9">ES-BaCBU035</subfield>
      </datafield>
      <datafield tag="100" ind1="1" ind2=" ">
        <subfield code="a">Trillas i Gay, Enric</subfield>
      </datafield>
      <datafield tag="245" ind1="1" ind2="0">
        <subfield code="a">Acció del vent sobre una estructura :</subfield>
        <subfield code="b">anà lisi teòric i experimental</subfield>
        <subfield code="h">[Recurs electrònic] /</subfield>
        <subfield code="c">Enric Trillas Gay ; dirigida per: E. Egusquiza Estevez i E. Valencia Leonardo</subfield>
      </datafield>
      <datafield tag="260" ind1=" " ind2=" ">
        <subfield code="c">1997</subfield>
      </datafield>
      <datafield tag="502" ind1=" " ind2=" ">
        <subfield code="a">Tesi doctoral-UPC. Escola Tècnica Superior d'Enginyers Industrials de Barcelona. Departament de Mecà nica de Fluids, 1997</subfield>
      </datafield>
      <datafield tag="650" ind1="0" ind2="4">
        <subfield code="a">Estructures</subfield>
        <subfield code="x">Accions</subfield>
        <subfield code="x">Models matemà tics</subfield>
        <subfield code="x">Tesis doctorals</subfield>
      </datafield>
      <datafield tag="650" ind1="0" ind2="4">
        <subfield code="a">Estructures</subfield>
        <subfield code="x">Prevenció contra el vent</subfield>
        <subfield code="x">Tesis doctorals</subfield>
      </datafield>
      <datafield tag="650" ind1="0" ind2="4">
        <subfield code="a">Estructures</subfield>
        <subfield code="x">CÃ lcul</subfield>
        <subfield code="x">Vent</subfield>
        <subfield code="x">Tesis doctorals</subfield>
      </datafield>
      <datafield tag="655" ind1=" " ind2="4">
        <subfield code="a">Tesis i dissertacions electròniques </subfield>
      </datafield>
      <datafield tag="700" ind1="1" ind2=" ">
        <subfield code="a">Egusquiza, Eduard</subfield>
      </datafield>
      <datafield tag="700" ind1="1" ind2=" ">
        <subfield code="a">Valencia Leonardo, Eugenio</subfield>
      </datafield>
      <datafield tag="710" ind1="2" ind2=" ">
        <subfield code="a">Universitat Politècnica de Catalunya.</subfield>
        <subfield code="b">Departament de Mecà nica de Fluids</subfield>
      </datafield>
      <datafield tag="730" ind1="0" ind2=" ">
        <subfield code="a">TDX</subfield>
      </datafield>
      <datafield tag="856" ind1="4" ind2="0">
        <subfield code="u">http://www.tdx.cat/TDX-0722109-103537/</subfield>
      </datafield>
      <datafield tag="907" ind1=" " ind2=" ">
        <subfield code="a">.b21442988</subfield>
        <subfield code="b">21-05-12</subfield>
        <subfield code="c">07-05-08</subfield>
        <subfield code="d">09-03-98</subfield>
        <subfield code="e">m</subfield>
        <subfield code="f">q</subfield>
        <subfield code="g">e</subfield>
        <subfield code="h">spa</subfield>
        <subfield code="i">spc</subfield>
        <subfield code="j">0</subfield>
        <subfield code="k">1</subfield>
      </datafield>
      <datafield tag="998" ind1=" " ind2=" ">
        <subfield code="a">p</subfield>
      </datafield>
      <datafield tag="935" ind1=" " ind2=" ">
        <subfield code="a">1447-36560</subfield>
      </datafield>
      <datafield tag="940" ind1=" " ind2=" ">
        <subfield code="a">UPC</subfield>
      </datafield>
      <datafield tag="999" ind1=" " ind2=" ">
        <subfield code="c">151237</subfield>
        <subfield code="d">151236</subfield>
      </datafield>
    </record>
     |
    Le but est de parser pour faire un update de cette partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <controlfield tag="001">.b21442988</controlfield>
    pour tous les rows dont le subfield 003 est = a "ES-BaCBU"
    Comme vous le voyez y'a 10 caracters et seul 9 sont acceptés donc il faut virer le dernier

    J'arrive a extraire les valeurs voulues avec la modification deja:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select  SUBSTRING(ExtractValue(marcxml,'//controlfield[@tag="001"]'),-10,9) as item
     from biblioitems
     where ExtractValue(marcxml,'//controlfield[@tag="003"]') ='ES-BaCBU'
     and LENGTH(ExtractValue(marcxml,'//controlfield[@tag="001"]'))=10;
    Le resultat du xml que je vous passe serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    | <?xml version="1.0" encoding="UTF-8"?>
    <record
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
        xmlns="http://www.loc.gov/MARC21/slim">
     
      <leader>01331ntm a22003257a 4500</leader>
      <controlfield tag="001">.b2144298</controlfield>
    ....
    Le probleme c'est que je ne sait pas faire une boucle pour faire un UPDATE des 9000 tuples concernées d'un seul coup car il faut utiliser une fonction du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UpdateXml(marcxml, '/record/controlfield[@tag=001]', '<controlfield tag="001">.b2144298</controlfield>')
    A part le probleme de l'update je voudrais que la function soit lancée par un trigger sur insert ou update.

    Quelque'un a une idée
    D'avance merci

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    les fonctionnalités mysql en xml sont ultra rudimentaires...

    pourquoi ne pas reproduire ton arborescence xml sous forme de tables? là tu n'utilise en rien un sgbd... tu peux faire ça plus facilement en php ou autre langage serveur...

    sinon il te suffit de faire une procédure stockée et un curseur...

    par contre, je t'enjoins à bien réfléchir à comment tu stockes, surtout qu'une grande partie du xml est répétitif...

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonsoir Eric

    je suis obligé de resté en mysql et donc de faire une procedure avec un trigger, c'est une des requêtes de ce projet.
    Tu peux me passer un exemple de curseur avec mysql ? juste pour voir si j'arrive a faire cet update.

    D'avance merci

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut a tous

    j'ai pris un exemple dur internet d'une procedure, je colle ici le code, il manque la partie ou l'on fait l'update...

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    DROP PROCEDURE IF EXISTS  upd001
    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE 'upd001'(
      IN name_in VARCHAR(255)
    )
    READS SQL DATA
    BEGIN
     
      DECLARE name_val VARCHAR(255);
      DECLARE status_update_val VARCHAR(255);
     
      DECLARE no_more_rows BOOLEAN;
      DECLARE loop_cntr INT DEFAULT 0;
      DECLARE num_rows INT DEFAULT 0;
     
      -- Declare the cursor
      DECLARE micursor CURSOR FOR
    	SELECT  SUBSTRING(ExtractValue(marcxml,'//controlfield[@tag="001"]'),-10,9) AS item
    	FROM biblioitems
    	WHERE ExtractValue(marcxml,'//controlfield[@tag="003"]') ='ES-BaCBU'
    	AND LENGTH(ExtractValue(marcxml,'//controlfield[@tag="001"]'))=10;
     
      -- Declare 'handlers' for exceptions
      DECLARE CONTINUE HANDLER FOR NOT FOUND
        SET no_more_rows = TRUE;
     
      -- 'open' the cursor and capture the number of rows returned
      -- (the 'select' gets invoked when the cursor is 'opened')
      OPEN micursor;
      select FOUND_ROWS() into num_rows;
     
      the_loop: LOOP
     
        FETCH  micursor
    -- Je supose que c'est ici que je dois coller l'update? non?
     
        INTO   name_val
        ,      status_update_val;
     
        -- break out of the loop if
          -- 1) there were no records, or
          -- 2) we've processed them all
        IF no_more_rows THEN
            CLOSE micursor;
            LEAVE the_loop;
        END IF;
     
        select name_val, status_update_val;
     
        SET loop_cntr = loop_cntr + 1;
     
      END LOOP the_loop;
     
      select num_rows, loop_cntr;
     
    END
    DELIMITER ;
    Quelqu'un peu ajouter sa pate pour l'update?
    D'avance merci

  5. #5
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    tu devrais te sortir la valeur de originale et l'identifiant de la ligne aussi dans le curseur pour l'update ensuite...

    Code sql : 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
    DROP PROCEDURE IF EXISTS  upd001;
    DELIMITER $$
    CREATE PROCEDURE 'upd001'(
      IN name_in VARCHAR(255)
    )
    READS SQL DATA
    BEGIN
      DECLARE no_more_rows BOOLEAN default false;
      declare i int;
      declare val varchar(9);
      -- Declare the cursor
      DECLARE micursor CURSOR FOR SELECT
        id,
        SUBSTRING(ExtractValue(marcxml,'//controlfield[@tag="001"]'),-10,9)
    	FROM biblioitems
    	WHERE ExtractValue(marcxml,'//controlfield[@tag="003"]') ='ES-BaCBU'
    	AND LENGTH(ExtractValue(marcxml,'//controlfield[@tag="001"]'))=10;
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;
       OPEN micursor;
       the_loop: LOOP
         FETCH  micursor INTO i,val;
         IF no_more_rows THEN
            CLOSE micursor;
            LEAVE the_loop;
         else
           update biblioitems set marcxml=UpdateXml(marcxml, '/record/controlfield[@tag=001]', concat('<controlfield tag="001">',val,'</controlfield>'))
           where id=i;
         END IF;
      END LOOP the_loop;
    END$$
    DELIMITER ;

    tu peux aussi essayer simplement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update biblioitems set marcxml=UpdateXml(marcxml,
      '/record/controlfield[@tag=001]',
      concat('<controlfield tag="001">',SUBSTRING(ExtractValue(marcxml,'//controlfield[@tag="001"]'),-10,9),'</controlfield>')
    where ExtractValue(marcxml,'//controlfield[@tag="003"]') ='ES-BaCBU'
      AND LENGTH(ExtractValue(marcxml,'//controlfield[@tag="001"]'))=10;

    [edit] la procedure est corrigée[/edit]

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonsoir
    Ok je vais essayer les 2 formes... Bien que la premiere me permet de declencher par un trigger. D'ailleurs a ce propos j'ai un doute:
    Si je cree un trigger sur INSERT par exemple, a quel moment le trigger se declenche t'il? A la fon de la transaction d'INSERT n'est ce pas?
    Ou s'il existe dans le code de l'application qui fait l'INSERT des commit, le trigger se declenche apres chaque commit?

    Aller demain c'est lundi et doit aller bosser ! (bien que vous en France vous avez de la chance la retraite n'est pas a 67 ans comme ici)
    Ciao !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Trigger d'update sur une seconde BD + champ date
    Par CHoule dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/05/2014, 09h09
  2. [Update] sur champ vide
    Par userB dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/06/2007, 10h22
  3. Réponses: 5
    Dernier message: 15/06/2007, 16h05
  4. [ORACLE 9i]Update sur champs avec contrainte
    Par gowser dans le forum SQL
    Réponses: 11
    Dernier message: 14/06/2007, 14h40
  5. Problème requete sur champs xml
    Par fred6655 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/09/2006, 13h19

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