5 XML Verilerinin Sorgulanması ve Güncellenmesi
Uygulamaların hem XML şeması tabanlı hem de şema tabanlı olmayan Oracle Veritabanındaki XML verilerini sorgulamasının ve güncellemesinin birçok yolu vardır.
5.1 XQuery'yi Oracle XML DB ile Kullanma
XQuery çok genel ve anlamlı bir dildir, ve SQL / XML fonksiyonları XMLQuery, XMLTable, XMLExistsve XMLCastSQL güçlü olan ifade ve hesaplama bu gücü birleştirir.
Genellikle XQuery'yi Oracle XML DB ile aşağıdaki şekillerde kullanırsınız. Buradaki örnekler, bu farklı kullanımları yansıtacak şekilde düzenlenmiştir.
- Oracle XML DB Deposu'nda XML verilerini sorgula.
- İlişkisel bir tabloyu sorgulayın veya XML verileriymiş gibi görüntüleyin. Bunu yapmak için, XQuery işlevini fn:collectionkullanarak, URI şeması adını oradbkullanarak verilerin veritabanı konumuyla birlikte bir URI'yi argüman olarak geçirirsiniz .
- Sorgu XMLTypeverileri, muhtemelen ortaya çıkan XML'i fonksiyonunu kullanarak ilişkisel verilere ayrıştırır XMLTable.
bu bölümdeki diğer örneklerin bazılarında kullanılan Oracle XML DB Deposu kaynaklarını oluşturur
Örnek 5-1 Örnekler için Kaynaklar Yaratmak
Kod:BİLDİRMEK
Kod:res BOOLEAN; empsxmlstring VARCHAR2 (300): = '<? xml sürümü = "1.0"?> <ÇYP'ler> <emp empno = "1" deptno = "10" ename = "John" maaş = "21000" /> <emp empno = "2" deptno = "10" ename = "Jack" maaş = "310000" /> <emp empno = "3" deptno = "20" ename = "Jill" maaş = "100001" /> </ ÇYP'ler> '; empsxmlnsstring VARCHAR2 (300): = '<? xml sürümü = "1.0"?> <emps xmlns = "http://example.com"> <emp empno = "1" deptno = "10" ename = "John" maaş = "21000" /> <emp empno = "2" deptno = "10" ename = "Jack" maaş = "310000" /> <emp empno = "3" deptno = "20" ename = "Jill" maaş = "100001" /> </ ÇYP'ler> '; deptsxmlstring VARCHAR2 (300): = '<? xml sürümü = "1.0"?> <Derinliklerden> <deptno = "10" dname = "Yönetim" /> <deptno = "20" dname = "Pazarlama" /> <deptno = "30" dname = "Satınalma" /> </ Derinliklerden> '; BAŞLA res: = DBMS_XDB_REPOS.createResource ('/ public / emps.xml', empsxmlstring); res: = DBMS_XDB_REPOS.createResource ('/ public / empsns.xml', empsxmlnsstring); res: = DBMS_XDB_REPOS.createResource ('/ public / depts.xml', deptsxmlstring); SON; /
5.1.1 XQuery Dizileri, Herhangi XQuery Türü Verilerini İçerebilir
XQuery'nin genel bir sıralama- düzenleme dili olduğunu akılda tutmak önemlidir . İfadeleri ve sonuçları mutlaka XML verileri değildir. Bir XQuery sıra numaralarını, dizeleri, Boole değerleri, tarih ve XML düğümü çeşitli içeren herhangi XQuery türü, öğeleri içerebilir ( document-node(), element(), attribute(), text(), namespace(), vb).
, bir örnekleme sağlar. SQL / XML işlevini XMLQuerybirkaç farklı türdeki öğeleri içeren bir XQuery dizisine uygular :
- bir tamsayı değişmezi: 1
- aritmetik bir ifade: 2 + 3
- bir dize değişmezi: "a"
- bir tam sayı dizisi: 100 to 102
- bir yapılandırılmış XML öğesi düğümü: <A>33</A>
ayrıca, gruplama için virgül operatörünü ( ,) ve parantezleri ( (, )) kullanarak bir dizinin oluşturulmasını gösterir .
Dizi ifadesi diziye 100 to 102değerlendirir (100, 101, 102), bu nedenle XMLQueryburada argüman, iç içe geçmiş bir dizi içeren bir dizidir. XQuery dizileri için her zaman olduğu gibi dizi argümanı otomatik olarak düzleştirilir. Argüman, aslında (1, 5, "a", 100, 101, 102, <A>33</A>).
Örnek 5-2 Farklı Türlerdeki Öğelerin Dizisine Uygulanan XMLQuery
Kod:SELECT XMLQuery ('(1, 2 + 3, "a", 100 ila 102, <A> 33 </A>) "
Kod:Çıkış İLE İLGİLİ) DUAL FROM'DAN; ÇIKTI -------------------------- 1 5 a 100 101 102 <A> 33 </A> 1 satır seçildi.
5.1.2 XQuery Kullanarak Oracle XML DB Havuzunda XML Verilerinin Sorgulanması
Oracle XML DB Deposu'nda XML verileriyle XQuery kullanan örnekler sunulmuştur. XQuery işlevlerini kullanın fn:docve fn:collectionsırasıyla depodaki dosya ve klasör kaynaklarını sorgulayın.
Buradaki örnekler fn:doc, XML verilerini içeren bir depo dosyası elde etmek için XQuery işlevini kullanır ve ardından XQuery değişkenlerini, söz konusu verinin parçalarını forve letFLWOR ifadesi maddelerini bağlar.
Oracle XML DB Deposu'nda iki XML belgesi kaynağını sorgular: /public/emps.xmlve /public/depts.xml. fn:docOlası FLWOR ifade cümlelerinin kullanımını ve her birini gösterir.
Olarak [Değerli Ziyaretci, linki görmeniz icin bu mesaja cevap yazmanız gerekiyorÜye olmak icin burayı tıklayınız] , çeşitli FLWOR maddeleri bu işlemleri gerçekleştirmek:
- forsırayla, her bir elemanın değerine değişken bağlayan empelemanlar üzerinde tekrarlar . Yani, çalışanlara bağlanan genel bir çalışan listesi üzerinde tekrarlanır ./public/emps.xml$e$e
- letdeğişken bağlanan $da dizisinin tüm değerlerinin oluşan dnamebu niteliklerini depteleman nitelikleri aynı değere sahip eleman öznitelik (bu bir birleştirme işlemidir). Yani, çalışan departmanı ile aynı departman numarasına sahip olan tüm bölümlerin isimlerine bağlanır . ( Değer, her bir değer için benzersizdir .) Bunun tersine , hiçbir zaman değerlerin üzerinde yinelemediğini unutmayın ; bu örnekte sadece bir kez ciltlenir./public/emps.xmldeptnodeptno$e$d$ednamedeptnodepts.xmlforl et$d
- Birlikte, forve letdizilerini akımı üretir ( $e, $d), nerede $ebir çalışan temsil eder ve $dbölümlerin hepsi isimlerini temsil etmek olduğunu çalışanın bu durumda -in ait olduğu, çalışanın benzersiz bölümünün benzersiz bir isimdir.
- where Bu tuple akışını filtreler, sadece maaşı 100.000'den fazla olan çalışanlarla ilişki kurar.
- order byfiltrelenen tuple akışını çalışan numarasıyla empno(artan düzende, varsayılan olarak) sıralar.
- returninşa empelemanları, her bir başlığın bir tane. Öznitelikler enameve deptbu elemanlar , sırasıyla enamegirdiden ve öznitelik kullanılarak oluşturulur $d. Öğe ve nitelik adlarının empve enameçıktıdaki giriş belgesindeki aynı adlarla gerekli bağlantının olmadığını unutmayın emps.xml.
ayrıca FLWOR ifadesi maddelerinin her birini kullanır. Bu XQuery fonksiyonların kullanımını gösterir doc, count, avgve integer, için ad olan yerleşik XQuery işlevler [Değerli Ziyaretci, linki görmeniz icin bu mesaja cevap yazmanız gerekiyorÜye olmak icin burayı tıklayınız]. Bu ad alanı önekle sınırlıdır fn.
Olarak [Değerli Ziyaretci, linki görmeniz icin bu mesaja cevap yazmanız gerekiyorÜye olmak icin burayı tıklayınız] , çeşitli FLWOR maddeleri bu işlemleri gerçekleştirmek:
- forsırayla, deptnogiriş belgesindeki özniteliklerin üzerinde /public/depts.xml, $dbu tür özniteliklerin değerine değişken olarak bağlanır .
- letdeğişkeni , öznitelikleri değeri olan (bu birleştirme işlemidir) giriş belgesindeki $etüm empöğelerden oluşan bir diziye değişkeni bağlar ./public/emps.xmldeptno$d
- Birlikte, forve letküpe (bir akımın üretilmesi $d, $e), nerede $dbir departman numarasını temsil eder ve $ebu bölümde çalışanların kümesini temsil eder.
- where Bu tuple akışını filtreler, yalnızca birden fazla çalışanla birlikte çalışır.
- order byFiltreli tuple akışını azalan düzende ortalama maaş ile sıralar. Ortalama, XQuery işlevinin avg(ad alanında fn) salary, empöğelerine eklenen öznitelik değerlerine uygulanmasıyla hesaplanır $e.
- returninşa big-deptelemanları tarafından üretilen her bir başlığın bir tane order by. text()Bir düğüm big-deptbağlı bölüm numarasını içerir $d. Bir headcountalt öğe, $eXQuery işlevi tarafından belirlenen , bağlı çalışan sayısını içerir count. Bir avgsalçocuk elemanı hesaplanan ortalama maaşı içerir.
Örnek 5-3 FLOWR Expression Kullanıma göre, nerede sipariş verelim, sipariş verelim.
Kod:SELECT XMLQuery ('doc içinde $ e için ("/ public / emps.xml") / emps / emp
Kod:izin ver $ d: = doc ("/ public / depts.xml") // dept [@deptno = $ e / @ deptno] / @ dname nerede $ e / @ maaş> 100000 $ e / @ empno tarafından sipariş ver return <emp ename = "{$ e / @ ename}" dept = "{$ d}" /> ' DOĞRUDAN İÇERİK); XMLQUERY ( '$ EINDOC ( "/ KAMU / EMPS.XML") İÇİN / EMPS / EMPLET $ D: = DOC ( "/ KAMU / DEPTS.XML") -------------------------------------------------- ------------------------------ <emp ename = "Jack" borçlandırması = "Yönetim"> </ emp> <emp ename = "Jill" dept = "Pazarlama" > </ Emp> 1 satır seçildi.
Örnek 5-4 Yerleşik İşlevleri Kullanarak FLOWR İfade
Kod:ELECT XMLQuery ('$ d için fn: doc ("/ public / depts.xml") / depts / dept / @ deptno
Kod:izin $ e: = fn: doc ("/ public / emps.xml") / emps / emp [@deptno = $ d] fn: count ($ e)> 1 nerede fn ile sipariş: avg ($ e / @ malary) azalan dönüş <Big-borç> {$ d <Sayımın> {fn: sayımı ($ e)} </ headcount>, <Avgsal> {xs: tamsayıdır (fn: ort ($ e / 'maaş))} </ avgsal>} </ Big-borç>' DOĞRUDAN İÇERİK); XMLQUERY ( '$ DINFN İÇİN: DOC ( "/ KAMU / DEPTS.XML") / Depts / BÖLÜMÜ / @ DEPTNOLET $ E: = FN: DOC ( "/ P -------------------------------------------------- ------------------------------ <big-dept deptno = "10"> <headcount> 2 </ headcount> <avgsal> 165500 </ avgsal> </ big-dept> 1 satır seçildi.
5.1.3 XQuery ve URI Şeması ile İlişkisel Veri Sorgulama oradb
İlişkisel tabloyu sorgulamak veya verileri XML verisi gibi görüntülemek için XQuery kullanan örnekler sunulur. Örnekler fn:collection, XQuery işlevini kullanır ve argüman olarak URI şema adını oradbkullanarak verilerin veritabanı konumuyla birlikte kullanılan bir URI'yi geçirir .
, fn:collectioniki ilişkisel tabloyu sorgulamak için bir FLWOR ifadesinde Oracle XQuery işlevini kullanır regionsve countries. Her iki tablo da örnek veritabanı şemasına aittir HR. Örnek ayrıca scalar SQL değerini AsiaXQuery değişkenine geçirir $regionname. Herhangi bir SQL ifadesi kullanılarak XQuery'ye iletilen bir değer üretilebilir PASSING. Bu durumda, değer bir SQL * Plus değişkeninden gelir REGION. Bu durumda değeri beklenen skaler SQL veri türüne çevirmeniz gerekir VARCHAR2(40).
Olarak [Değerli Ziyaretci, linki görmeniz icin bu mesaja cevap yazmanız gerekiyorÜye olmak icin burayı tıklayınız] , çeşitli FLWOR maddeleri bu işlemleri gerçekleştirmek:
- forçağrılarla döndürülen XML öğelerinin dizileri üzerinde yineleme yapar fn:collection. İlk çağrıda, her eleman bir dizi ilişkisel tabloya karşılık gelir hr.regionsve değişkene bağlanır $i. Benzer şekilde, ikinci çağrıda fn:collection, $jardışık sıradaki tablolara bağlanır hr.countries. Yana regionsve countriesolmayan XMLTypetablolar, her bir tablodaki bir satıra karşılık gelen üst düzey elemanıdır ROW(bir sargı elemanı) sağlanabilir. Satır öğeleri üzerinde yineleme sırasız.
- wheresatırları her iki tablodan da filtreler, yalnızca region_idher bir tablo için aynı olan satırların çiftlerini ( bir birleştirme gerçekleştirir region_id) ve kim region_nameolduğunu korur Asia.
- returnfiltrelenmiş satırları tablodan üst düzey öğe olarak hr.countriesXML parçaları içeren bir XML belgesi olarak döndürür ROW.
fn:collection ilişkisel verileri sorgulamak için iç içe geçmiş FLWOR ifadelerinde kullanır .
Olarak [Değerli Ziyaretci, linki görmeniz icin bu mesaja cevap yazmanız gerekiyorÜye olmak icin burayı tıklayınız] , çeşitli FLWOR maddeleri bu işlemleri gerçekleştirmek:
- Dış fortarafından döndürülen bir XML elemanlarının dizisi üzerinde dolaşır fn:collection: her bir elemanın ilişki tablosunun bir satıra karşılık gelmektedir oe.warehousesve değişkene bağlıdır $i. Bu yana warehousesbir değil XMLTypetablo, bir satıra karşılık gelen üst düzey bir elementtir ROW. Satır öğeleri üzerindeki yineleme sırasız.
- Aynı forşekilde, içsel yineleyiciler, geri dönen bir XML öğeleri dizisi üzerinden fn:collection: her eleman bir ilişkisel tablonun sırasına karşılık gelir hr.locationsve değişkene bağlanır $j.
- wheretuplleri ( $i, $j) filtreler, sadece location_idçocuğu için aynı olanları tutar $ive $j(bir katılım gerçekleştirir location_id).
- İç returneleman bir XQuery dizisini oluşturur STREET_ADDRESS, CITYve STATE_PROVINCEyer-tabloda çocuk her biri, ROWeleman $j; Yani, aynı adın konum tablosu sütunlarının değerleridir.
- Dış return, iç kısmın sonucunu returnbir Locationparçaya sarar ve bunu bir Warehouseelemanın içinde sarar . Sağladığı Warehousebir ile elemanının iddeğeri gelen öznitelik warehouse_idtablonun sütunu warehouses.
Paylaş