ORACLE XML TYPE

Share Button

Merhaba,

XML günümüz programlama dünyasının en sık kullanılan veri yapılarından biri haline gelmiştir. Birçok haberleşme teknolojisi ve protokolü içeriside XML barındırmaktadır. Bu gelişmelerden ötürü XML dosyaları üzerinde istenilen veriye ulaşmak, doküman içerisinde güncelleme yapmak, yeni doküman oluşturmak gibi işlemler önem kazanmıştır. Oracle XML Type Oracle 9i ile gelen bir veri tipidir. Tablolar veya PL/SQL blokları içerisinde sıkça kullandığımız diğer veri tipleri (NUMBER, DATE, VARCHAR2) gibi kullanılabilinir. Bizi karmaşık XML dosyalarını xmldom ile parse etme yükünden ve büyük bir kod yükünden kurtarmaktadır. Hata riskini de en düşük seviyeye çekmektedir.

Bu yazıda basitçe XML Type veri tipinin tablo içerisinde tutulmasını, doldurulmasını ve de basit birkaç parse SQL örneği göstereceğim.

Öncelikle başlangıç kurulumu için aşağıdaki SQL’i çalıştırarak öncelikle XML Type içeren basit bir tablo oluşturulacaktır. Sonrasında T.C. Merkez Bankası Kur XML dosyası tablo içindeki XML Type alanına yüklenecektir. Merkez Bankasının kurlar için sağladığı XML düzenli ve bu örnek için uygun bir XML dosyasıdır.

Kod tabloyu yarattıktan sonra UTL_HTTP ve DBMS_LOB yardımıyla Merkez Bankasından kurları çekip CLOB veri tipine atıp, tabloya yükleyecektir.

Merkez Bankasından çekilen XML örneği aşağıdaki gibidir. Bu noktada TAG ve Attribute isimleri XML Type içerisinde kullanılacağı için önem arz etmektedir.

Aşağıdaki sorgular ilgili XML içerisindeki verilere ulaşmak için kullanılabilinir.

Dikkat edilmesi gereken noktalardan birinin XML içerisinde yer alan Currency TAG işaretinin her kur için tekrar ettiğidir.

XML içerisinden veri çekmek için XML_TYPE.extract fonksiyonunu kullanıyoruz. Fonksiyonun parametresi ulaşılmak istenen tag yoludur. Ancak en son seviyeden sonra text() veya node() eklenmesi gerekmektedir. Eklenmediği takdirde gelen değer tag işaretini de içerecektir. Extract fonksiyonunun dışına eklenen getStringVal() fonksiyonu ise değeri hangi türden çekmek istediğinizi belirtir. getstringval() dışında getclobval() ile CLOB veri tipi getnumberval() ile NUMBER veri tipi olarak da çekebilirsiniz. NUMBER kullanırken verinin alfa-nümerik karakter içermemesine dikkat edin aksi takdirde hata alırsınız. Aşağıdaki SQL en basit extrat örneğidir. XML içerisinde Currency Tag’i altında yer alan Isim Tagine ulaşmak için kullanılır.

Sonuç:

Extract

Sonuçta dikkat edilmesi gereken hususlardan biri tekrar eden her kur aynı satırda gelmiştir. Farklı satırda çekebilmek için başka özelliklerin de eklenmesi gerekmektedir. Yazının devam kısımlarında o konu da incelenecektir.

Not: Extract fonksiyonuna dizin belirtirken en tepeden başlıyorsanız “/” işareti ile başlayabilirsiniz. Ancak alt seviyelerden başlarken “//” ile başlayarak devam etmelisiniz. “*” işareti de bütün veri anlamına gelmektedir. Aşağıda örnek olarak görebilirsiniz.

node() veya text() komutları dizin yolunda kullanılmadığı durumda XML Type olarak sonuç alabilirsiniz;

Sonuç:

Örnek

TAG içerisinde yer alan Attribute değerlerine ulaşmak isteniliyorsa;

Sonuç:

4

 Bu noktaya kadar tekrar eden tag’leri tek satırda çektik. Birden fazla satırda çekmek için sorgunun FROM kısmına XMLSEQUENCE değeri VARRAY tipinde TABLE ve EXTRACT ile birleştirilerek eklenir. FROM içerisinde diğer kısımda XML Type içeren tablomuz yer almalıdır. Herhangi bir join yapılması gerekmemektedir. Verileri çekerken de EXTRACT yerine EXTRACTVALUE kullanılmalıdır. EXTRACTVALUE, FROM kısmına eklenen tablonun VALUE fonksiyonu içerisindeki değeri ve ulaşılmak istenen TAG değeri olmak üzere iki parametre almaktadır.

En kaba haliyle Currency tagi altındaki tekrar eden bütün tagleri tablolayıp sadece Unit, CurrencyName ve ForexBuying taglerini  çekmek için aşağıdaki sorguyu kullanabilirsiniz;

Sonuç:

5

Currency tagi altındaki tekrar eden bütün tagleri tablolayıp yukardaki sorgunun aksine bütün taglerini  çekmek için aşağıdaki sorguyu kullanabilirsiniz;

Sonuç:

6

 

Sadece USD Currency değerine ulaşmak, sadece ForexBuying alanını çekmek ve yanında TAG adını da çekmek için aşağıdaki sorguyu kullanabilirsiniz;

7

Örnekleri burada noktalıyorum. XML Type sadece veri çekmek için değil, XML güncellemek, oluşturmak, arama yapmak için de kullanılabilinir. Daha fazla kaynak için aşağıdaki link’i inceleyebilirsiniz.

http://docs.oracle.com/cd/B10500_01/appdev.920/a96620/xdb04cre.htm