1. listopadu 2007

A je to tady - XQuery Update v pureXML

Kdo si počká, ten se dočká. Od včera je možné si stáhnout IBM DB2 UDB 9.5. A proč tolik povyku. Kromě mnoha další vylepšení, je konečně implementován i draft XQuery Update Facility. Asi nebudu sám, kdo cítil velký nedostatek v nemožnosti updatovat část XML dokumentu uloženého pomocí pureXML.

Nebudu dlouho běhat okolo horké kaše a ukážeme si pár příkladů.

Máme tabulku friend, která má sloupec info. V této tabulce máme jeden záznam:

<friend>
<name>Jiri Mares</name>
<phone type="work">222 222 222</phone>
<phone type="home">333 333 333</phone>
</friend>
A nyní si ukážeme prostou změnu mého čísla do práce (využiji skutečnosti, že mám v tabulce jeden řádek a vypustím klauzili where z SQL update příkazu):
update friend
set info = xmlquery( 'copy $new := $INFO
modify do replace value of $new/friend/phone[@type="work"] with "111 111 111"
return $new');
Což přidat telefon na mobil:
update friend
set info = xmlquery('copy $new := $INFO
modify do insert <phone type="cell">444 444 444</phone>
as last into $new/friend
return $new' );
Nebo můžeme přejmenovat tag name na full-name:
update friend
set info = xmlquery('copy $new := $INFO
modify do rename $new/friend/name as "full-name"
return $new' );
Dále jsem neukázal mazání nodu:
update friend
set info = xmlquery('copy $new := $INFO
modify do delete $new/friend/phone[@type="cell"]
return $new');
Můžeme nahradit více tagů najednou:
update friend
set info = xmlquery(' copy $new := $INFO
modify (
do replace value of $new/friend/phone[@type="home"] with "999 999 999",
do replace value of $new/friend/phone[@type="work"]/@type with "cell")
return $new' );
Začíná se mi XQuery líbit čím dál tím víc, je jednoduché, čitelné, skoro bych řekl sexy :-).

Na závěr nutno říci, že XQuery Update nemusíte používat jenom při SQL updatu, ale i v selectu. Takže pokud nechcete vracet uživateli hodnotu telef. čísel na mobil, pak stačí udělat dotaz:
xquery copy $new := db2-fn:sqlquery("select info from friend")
modify for $j in $new/friend/phone[@type="cell"] return
do replace value of $j with "XXX XXX XXX"
return $new;

A co mě ještě v pureXML zaujalo

Je toho hodně nového, ale ... zajímavá je rychlost, takže je fajn, když se XML dokument může uložit ve stejné stránce jako ostatní sloupce řádku tabulky, protože celý řádek je k dispozici pomocí jediné I/O operace (i když platí omezení na velikost XML dokumentu max. 32k - nebojte, je-li dokument větší, neznamená to chybu, ale pouze se standardně uloží do XDA).

Zajímavá je intergrace XSLT enginu přímo do DB2 (když už je XML uloženo v podobě stromu, přímo si to o tuto integraci říká). Díky nové funkci parameter padá nemožnost předávat parametry do sqlquery funkce. A další ...

Žádné komentáře: