Ana içeriğe geç

Temel Özellikler

Güncelleme Temel İşlemleri

XQuery Update Facility (kısaca XQUF), XML düğümleri üzerinde çalışan beş temel işlem sunar::

  • ekle bir veya daha fazla düğümü inside/after/before belirtilen bir düğüme
  • sil bir veya daha fazla düğümü
  • değiştir bir düğümü (öğeyse tüm alt öğeleriyle birlikte) düğüm dizisiyle.
  • değiştir düğümün içeriğini (alt öğelerini) düğüm dizisiyle veya düğümün değerini bir dize değeriyle.
  • yeniden adlandır bir düğümü (öğeler, öznitelikler ve işleme talimatları için geçerlidir); içeriğini veya özniteliklerini etkilemeden.

Güncelleme Temel İşlemlerini Temel Dille Birleştirme

Genellikle güncellemek istediğimiz düğümü/düğümleri seçmek için sıradan bir sorgu kullanır, ardından bu düğümlere güncelleme işlemleri uygularız. Bu, SQL UPDATE... WHERE... yönergesine benzer.

Örnek 1: Bir belgede doc.xmlbir öğesinin tüm alt öğelerini yeniden adlandırın: CATEGORY as CATEGORY_NAME:

1
2
for $name in doc("doc.xml")//CATEGORY/NAME   (: selection :)
return rename node $name as CATEGORY_NAME    (: update :)

Örnek 2: Id özniteliği olan tüm BOOK öğelerinde, bu özniteliği ilk sıradaki bir ID alt öğesiyle değiştirin:

1
2
3
4
5
6
for $idattr in doc("data.xml")//BOOK/@Id     (: selection :)
return (            
   delete node $idattr,                      (: update 1 :)
   insert node <ID>{string($idattr)}</ID>    (: update 2 :)
      as first into $idattr/..
)

Son betikle aşağıdaki parça

1
<BOOK Id="0025">some content</BOOK> 

şu şekilde değiştirilir:

1
<BOOK><ID>0025</ID>some content</BOOK> 

Not

İkinci örnekte silme işleminin **insert node ** işleminden önce mi sonra mı yazıldığı tamamen önemsizdir. XQUF'nin bu şaşırtıcı özelliği aşağıda açıklanmaktadır.

5 güncelleme işleminin temel XQuery diliyle birleştirilme biçimine ilişkin bazı kısıtlamalar vardır. XQUF, şu ifadeler arasında ayrım yapar: Güncelleme İfadeleri (güncelleme temel işlemlerini kapsayan) ve güncelleme yapmayan ifadeler. Güncelleme İfadeleri her yerde kullanılamaz. Bu konu daha ayrıntılı olarak açıklanacaktır.

İşleme Modelleri

Güncelleme temel işlemlerini kullanmanın iki ana yolu vardır:

XML veritabanını doğrudan güncelleme:

Önceki konudaki örneklerde bir veritabanına ait düğümler seçilir ve ardından güncellenir.

Info

XQUF'deki veritabanı kavramı oldukça geneldir: herhangi bir XML belge koleksiyonunu veya iyi biçimlendirilmiş parçaları (ağaçları) ifade eder.

XQuery Update, güncelleme işlemlerinin veritabanına uygulanma protokolünü kesin olarak tanımlamaz; bunu uygulamalara bırakır. Örneğin, işlem ve yalıtım konuları belirtimlerde ele alınmaz.

Betik yürütmesi tamamlandığında güncellemelerin veritabanına uygulanacağı varsayılır. Dil, "apply-updates" işleminin anlamı kesin olarak tanımlanacak, ancak veritabanı uygulamalarının en iyi duruma getirme yapabilmesi için olabildiğince geniş bir alan bırakılacak şekilde tasarlanmıştır.

Dikkat edilmesi gereken noktalar:

  • Güncellemeler, güncelleme ifadesi yürütülürken hemen uygulanmaz*. Bunun yerine "Bekleyen Güncelleme Listesi"nde biriktirilir. Yürütmenin sonuna doğru bir noktada bekleyen güncellemelerin tümü bir kerede uygulanır ve veritabanı atomik olarak güncellenir.

Dikkat çekici bir sonuç şudur: güncellemeler betik yürütülürken görünmez, yalnızca sonrasında görünür. Bu durum geliştiriciler için oldukça rahatsız edici olabilir. Ayrıca programlama tarzını da belirgin biçimde etkiler. Bu etkinin örneklerini ve bununla nasıl başa çıkılacağını ileride göreceğiz.

  • Aynı ifade birden fazla belgeyi aynı anda güncelleyebilir. Yukarıdaki örnekler tek bir doc.xml belgesi yerine herhangi bir belge koleksiyonuna uygulanabilir. Örnek:
1
2
for $name in collection("/allbooks")//CATEGORY/NAME
return rename node $name as CATEGORY_NAME 

Yan etkisiz dönüşümler:

XQUF'de ek bir işlem olan transform mevcut bir düğümün kopyasını özgününü değiştirmeden günceller ve dönüştürülmüş ağacı döndürür.

Aşağıdaki örnek, özgün belgeye dokunmadan doc.xml'in dönüştürülmüş bir sürümünü oluşturur:

1
2
3
4
5
6
copy $d := doc("doc.xml")
modify ( 
  for $n in $d//CATEGORY/NAME
  return rename node $n as CATEGORY_NAME
 )
return $d

XQUF'nin modify yan tümcesi içinde kopyalanmış ağaçların özgün sürümünün (burada doc.xml belgesinin kendisinin) değiştirilmesini yasakladığını unutmayın; yalnızca kopyalanmış ağaçlar değiştirilebilir.
Aşağıdaki ifade hataya yol açar:

1
2
3
4
5
6
7
copy $d := doc("doc.xml")

modify ( 
  for $n in doc("doc.xml")//CATEGORY/NAME(: *** wrong *** :)
  return rename node $n as CATEGORY_NAME
 )
return $d