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