22 Temmuz 2015 Çarşamba

Mysql ile UpdateXML ve ExtractValue



Mysql veritabanında elimizde uzun xml içerikler içeren bir tablo var ve bu tablo üzerinde xml içerik üzerinde bir değişiklik yapmak isteyebiliriz. Bu durumda mysql'in UpdateXML fonksiyonunu kullanarak koca! xml içeriği içerisinden bir xml etiketi içeriğini değiştirebiliriz. İnternette birçok örnek var fakat hepsinde hatalı yazım bulunmakta =D xml'i yanlış yazdıklarından dolayı update işlemini gerçekleştirince xml kolon içeriğimiz NULL olmaktadır. Bende dedim düzgün bir örnek yazıyım.

İlk önce xml veri içerecek bir tablo oluşturalım. 

CREATE TABLE football ( 
           ID int(11) NOT NULL PRIMARY KEY,
           info TEXT
) ENGINE=InnoDB DEFAULT 
CHARSET=utf8 COLLATE=utf8_unicode_ci;

Şimdi de verileri ekleyelim.

INSERT INTO football VALUES (1,"
<footballmatch number='1'>       
<team>Fenerbahçe   
    <number>1</number>
    <division>Türkiye Süper Lig</division>
</team>
<player>  
    <number>17</number>
    <name>Luis   
          <lastname>Nani</lastname>
          <f>R</f>
    </name>
</player>
<sets>   
    <apperance>7</apperance>
    <goal>3</goal>
    <assists>12</assists>  
</sets>
</footballmatch>");
INSERT INTO football VALUES (2,"
<footballmatch number='2'>       
<team> Fenerbahçe  
    <number>1</number>
    <division>Türkiye Süper Lig</division>
</team>
<player>  
    <number>11</number>
    <name>Robin   
          <lastname>Van Persie</lastname>
          <f>L</f>
    </name>
</player>
<sets>   
    <apperance>5</apperance>
    <goal>11</goal>
    <assists>1</assists>  
</sets>
</footballmatch>");
INSERT INTO football VALUES(13,"
<footballmatch number='3'>       
<team> Salatasaray  
    <number>6</number>
    <division>Türkiye Süper Lig</division>
</team>
<player>  
    <number>55</number>
    <name>Sabri   
          <lastname>Sarıoğlu</lastname>
          <f>R</f>
    </name>
</player>
<sets>   
    <apperance>11</apperance>
    <goal>5</goal>
    <assists>0</assists>  
</sets>
</footballmatch>");

Update işlemini yapalım. Ama önce tablomuzdaki Sabri Sarıoğlunun verilerini görelim. Sonra update yapalım. Sonra tekrar çıktısına bakarak üzerindeki değişikliği görebiliriz.

| ID | info|
+----+-------+
| 13 |  <footballmatch number='3'>        
           <team> 6alatasaray   
                 <number>6</number>
                 <division>Türkiye Süper Lig</division>
            </team>
            <Player>   
                 <number>55</number>
                 <name>Sabri    
                      <lastname>Sarıoğlu</lastname>
                      <f>R</f>
                  </name>
             </Player>
             <sets>    
                   <apperance>11</apperance>
                   <goal>5</goal>
                   <assists>0</assists>

             </sets>
             </footballmatch>     |
UPDATE football SET info=UpdateXML(info,'/footballmatch/sets/assists','<assists>2</assists>')
WHERE ID=13;
| ID | info|
+----+-------+
| 13 |  <footballmatch number='3'>        
           <team> 6alatasaray   
                 <number>6</number>
                 <division>Türkiye Süper Lig</division>
            </team>
            <Player>   
                 <number>55</number>
                 <name>Sabri    
                      <lastname>Sarıoğlu</lastname>
                      <f>R</f>
                  </name>
             </Player>
             <sets>    
                   <apperance>11</apperance>
                   <goal>5</goal>
                   <assists>2</assists>
             </sets>
             </footballmatch>     |

Ayrıca UpdateXML içinde uzun uzun '/footballmatch/sets/goal' yazmak yerine '//goal' yazarak da güncelleme yapabiliriz. Fakat bu sefer tüm 2. nesil xml etiketlerindeki assists değerlerinin hepsi güncellenecektir. Mesela hem <Player> hemde <sets> içinde <goal> var ise ikisi de güncellenecektir. Burada sadece sets içinde <goal> olduğundan tek bir yer değişmektedir. Sıradaki örneğimiz Uçan Hollandalı Van Persie için gelsin...

mysql> select * from football WHERE ID=2;;+----+--+
| ID |   info       |
+----+---------+
|  2 |  <footballmatch number='2'>        
                 <team> FENERBAHÇE   
                      <number>1</number>
                     <division>Türkiye Süper Lig</division>
                </team>
                <Player>   
                       <number>11</number>
                       <name>Robin    
                             <lastname>Van Persie</lastname>
                             <f>L</f>
                      </name>
                 </Player>
                <sets>    
                      <apperance>5</apperance>
                      <goal>11<goal>
                      <assists>1</assists>
                </sets>
            </footballmatch>    |
UPDATE football SET MATCH_INFO=UpdateXML(MATCH_INFO,'//goal','<goal>20<goal>') WHERE ID=2;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from football WHERE ID=2;;+----+--+
| ID |   info       |
+----+---------+
|  2 |  <footballmatch number='2'>        
                 <team> FENERBAHÇE
                      <number>1</number>
                     <division>Türkiye Süper Lig</division>
                </team>
                <Player>   
                       <number>11</number>
                       <name>Robin    
                             <lastname>Van Persie</lastname>
                             <f>L</f>
                      </name>
                 </Player>
                <sets>    
                      <apperance>5</apperance>
                      <goal>20<goal>
                      <assists>1</assists>
                </sets>
            </footballmatch>    |
Sadece güncellediğimiz xml etiketini görmek istiyorsak ExtractXML fonksiyonunu kullanabiliriz. Örnek olarak 6alatasaray'lı reis Sabri'nin 2 assists ve 5 gol performansını verelim.


mysql> SELECT ExtractValue(MATCH_INFO,'/footballmatch/sets/assists') AS ASSISTS 
                FROM football WHERE ID=13;
+  ---------    +
|   ASSISTS |
+  ---------     +
|         2         |
+  ---------     +
1 row in set (0.00 sec)


mysql> SELECT ExtractValue(MATCH_INFO,'//goal') AS GOALS
                FROM football WHERE ID=13;
+  ---------    +
|   GOALS   |
+  ---------     +
|         5         |
+  ---------     +
1 row in set (0.00 sec)

Böylece yazımı bitiriyorum. Herkese saygılar sevgiler. Son olarak Hulk'un yaptığı gibi, ırkçılara sadece öpücük yolluyoruz...

Hulk: 'Sadece öpücük gönderiyorum'

Hiç yorum yok:

Yorum Gönder