Az Oracle XML DB Kiss Attila Master dr
Az Oracle XML DB Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 1
Az előadás vázlata 1. XML típusú mező definiálása, XML adatok beszúrása, lekérdezése * 2. XML sortípus használata * 3. XML függvények használata * 4. XMLIndexek használata 5. Összefoglalás * (Nikovits Tibor gyakorlatainak anyaga) Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 2
XML típusú mező • Az Oracle az SYS. XMLTYPE típust használja XML tárolásra. • A típushoz PUBLIC szinonima van definiálva, ezért XMLTYPE is használható. CREATE TABLE raktar (raktar_azon NUMBER(3), raktar_spec SYS. XMLTYPE, raktar_nev VARCHAR 2(35 BYTE), epulet_azon NUMBER(4) ); Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 3
XML beszúrása • A beszúrás a Create. XML metódussal történik. INSERT INTO raktar VALUES(1, SYS. XMLType. Create. XML( '<? xml version="1. 0"? > <Raktar> <Tulaj>Sajat</Tulaj> <Terulet>25000</Terulet> <Folyoviz>Igen</Folyoviz> <Vasut>Nem</Vasut> <Parkolas>Utca</Parkolas> </Raktar>'), 'raktar 1', '1000'); Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 4
XML adatok lekérdezése • A lekérdezés során XPath kifejezést és az EXTRACT metódus használjuk. SELECT r. raktar_azon, r. raktar_spec. EXTRACT('/Raktar/Tulaj') Eredmeny FROM raktar r; RAKTAR_AZON EREDMENY -------1 <Tulaj>Sajat</Tulaj> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 5
XML típus átalakítása karaktertípussá • Egy XML dokumentumot karakter típusú adattá konvertálhatunk a get. String. Val metódussal, vagy CLOB-bá a get. CLob. Val függvénnyel. SELECT r. raktar_azon, r. raktar_spec. EXTRACT('/Raktar/Terulet'). get Stringval() Eredmeny FROM raktar r WHERE r. raktar_azon=1; RAKTAR_AZON Eredmeny -------1 <Terulet>25000</Terulet> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 6
XML elem értékének kiolvasása • Az elem értékét a text() metódussal kaphatjuk meg. • A visszakapott értéké típusa nem karakter, hanem úgynevezett XML dokumentum-töredék. SELECT r. raktar_azon, r. raktar_spec. EXTRACT('/Raktar/Tulaj/text()') Eredmeny FROM raktar r; RAKTAR_AZON Eredmeny -------1 Sajat Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 7
XML elem értékének kiolvasása • A text() értéket a get. String. Val, get. Number. Val metódusokkal lehet átalakítani. SELECT r. raktar_azon, r. raktar_spec. extract('/Raktar/Tulaj/text()'). get. Stringval() Eredmeny, r. raktar_spec. extract('/Raktar/Terulet/text() '). get. Numberval() Eredmeny 2 FROM raktar r WHERE r. raktar_azon=1; RAKTAR_AZON Eredmeny 2 ---------------1 Sajat 25000 Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 8
XML sorobjektum • Az eddigi példákban az XML típus oszlopobjektumként szerepelt. • Az XML lehet sorobjektum is. CREATE TABLE kolcsonzes_xmlt OF XMLType; INSERT INTO kolcsonzes_xmlt SELECT kolcs_spec FROM kolcsonzes k WHERE azon=1; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 9
XML sorobjektum lekérdezése • Mivel az XML sorobjektum is objektum, ezért az objektumokra vonatkozó lekérdezést használhatjuk. SELECT object_value FROM kolcsonzes_xmlt; OBJECT_VALUE -----------------<Kolcsonzesek>. . . </Kolcsonzesek> • Vagy a fentivel ekvivalens alábbi módon: SELECT VALUE(k) FROM kolcsonzes_xmlt k; VALUE(k) -----------------<Kolcsonzesek>. . . </Kolcsonzesek> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 10
XML sorobjektumok kezelése • A sorobjektumnak is van objektum azonosítója, amit lekérdezhetünk vagy beszúrhatunk egy táblába, majd a DEREF függvény segítségével lekérdezhetjük az objektumot. SELECT REF(t) FROM kolcsonzes_xmlt t; CREATE TABLE xmlt_ref AS SELECT 1 AS azon, REF(t) AS xmldoku FROM kolcsonzes_xmlt t; SELECT DEREF(xmldoku) FROM xmlt_ref; DEREF(xmldoku) -----------------<Kolcsonzesek>. . . </Kolcsonzesek> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 11
XML sorobjektumok kezelése • XPath lekérdezést is megfogalmazhatunk XML sorobjektumra. SELECT DEREF(xmldoku). EXTRACT('//Kolcsonzo[ @nev="Gipsz Jakab"]//CD') FROM xmlt_ref; ------------<CD eloado="Zoran"> <Cim>Szep Holnap</Cim> <Ar>3000</Ar> </CD> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 12
DTD használata • Az érvényességhez DTD-t adhatunk meg. INSERT INTO kolcsonzes VALUES(3, SYS. XMLType. Create. XML( '<? xml version="1. 0" standalone="no"? > <!DOCTYPE személy [ <!ELEMENT személy EMPTY> <!ATTLIST személy név CDATA #REQUIRED gyumolcs CDATA #IMPLIED> ]> <személy név="Klotild" gyumolcs="dinnye"/>')); SELECT k. kolcs_spec. EXTRACT('/') FROM kolcsonzes k WHERE azon=3; ---------------------<személy név="Klotild" gyumolcs="dinnye"/> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 13
XML függvények • Az Oracle sokféle függvényt biztosít arra, hogy a különböző formátumú adatokból (relációs, objektum-relációs) XML dokumentumot tudjunk létrehozni, illetve fordítva. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 14
SYS_XMLGEN(kif [, fmt]) függvény • XML dokumentumot hoz létre a paraméterül kapott értékből. Megjegyzések: • Ha egy SELECT utasításban használjuk a lekérdezés valamelyik oszlopára, akkor minden sorra külön dokumentumot hoz létre. • Ha a paraméter egy skalár érték, akkor egy ezt tartalmazó XML elemet ad vissza. • Ha a paraméter egy objektum példány, az attribútumokat külön XML elemekre képezi le. • A '@'-al kezdődő attribútumokból XML attribútumot (és nem XML elemeket!) csinál. • Ha a paraméter egy XML dokumentum töredék, akkor azt egy XML elembe ágyazza. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 15
SYS_XMLGEN(kif [, fmt]) függvény • Példa: SELECT SYS_XMLGEN(dnev) FROM dolgozo WHERE ROWNUM < 3; ----------<? xml version="1. 0"? > <DNEV>SMITH</DNEV> <? xml version="1. 0"? > <DNEV>ALLEN</DNEV> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 16
SYS_XMLGEN(kif [, fmt]) függvény • Az első lekérdezés egy XML töredéket ad vissza, amiből a függvény XML-t csinál. (Az elsőben nem egyetlen gyökérelem van, ezért nem jól formált XML dokumentum az eredmény. ) SELECT EXTRACT(kolcs_spec, '//DVD'). get. String. Val() FROM kolcsonzes WHERE azon=1; ----------------------------<DVD ar="4000">Jegkorszak</DVD><DVD ar="3500">Shrek</DVD><DVD ar="2500">Uvegtigris</DVD> SELECT SYS_XMLGEN(EXTRACT(kolcs_spec, '//DVD')). get. String. Val() FROM kolcsonzes WHERE azon=1; ----------------<? xml version="1. 0"? > <ROW> <DVD ar="4000">Jegkorszak</DVD> <DVD ar="3500">Shrek</DVD> <DVD ar="2500">Uvegtigris</DVD> </ROW> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 17
SYS_XMLGEN(kif [, fmt]) függvény • Az EXTRACT által visszaadott szöveges dokumentumtöredékek egybeolvadnak egyetlen töredékké. SELECT EXTRACT(kolcs_spec, '//DVD/text()'). get. String. Val() FROM kolcsonzes WHERE azon=1; ------------Jegkorszak. Shrek. Uvegtigris SELECT SYS_XMLGEN(EXTRACT(kolcs_spec, '//DVD/text()')). get. String. Val() FROM kolcsonzes WHERE azon=1; -------------<? xml version="1. 0"? > <ROW>Jegkorszak. Shrek. Uvegtigris</ROW> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 18
Az elem nevének megváltoztatása • Az elem nevét meg is lehet változtatni egy formázó objektum megadásával. SELECT SYS_XMLGEN(EXTRACT(kolcs_spec, '//DVD/text()'), SYS. XMLGen. Format. Type. Create. Format('ELEM')). get. String. Val() FROM kolcsonzes WHERE azon=1; --------------<? xml version="1. 0"? > <ELEM>Jegkorszak. Shrek. Uvegtigris</ELEM> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 19
Objektumok lekérdezése SELECT SYS_XMLGEN(TAGOK) FROM csapat WHERE nev='Fradi'; --------------<? xml version="1. 0"? > <TAGOK> <SZEMELY_TYP> <NEV>Albert Flori</NEV> <CIM> <UTCA>Kicsi</UTCA> <VAROS>Bp</VAROS> <ORSZAG>Magyar</ORSZAG> <IRSZAM>1234</IRSZAM> </CIM> </SZEMELY_TYP> <NEV>Novak Dezso</NEV> <CIM> <UTCA>Nagy</UTCA> <VAROS>Vac</VAROS> <ORSZAG>Magyar</ORSZAG> <IRSZAM>4321</IRSZAM> </CIM> </SZEMELY_TYP> </TAGOK> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 20
SYS_XMLAGG(kif [, fmt]) függvény • A kifejezés által meghatározott dokumentumokból vagy töredékekből (az összes sorból) egy XML dokumentumot hoz létre. Ennek is lehet formázó objektum paramétert megadni. SELECT SYS_XMLAGG(SYS_XMLGEN(dnev)). get. String. Val() FROM dolgozo WHERE ROWNUM < 3; ----------<? xml version="1. 0"? > <ROWSET> <DNEV>SMITH</DNEV> <DNEV>ALLEN</DNEV> </ROWSET> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 21
SYS_XMLAGG(kif [, fmt]) függvény • Ugyanez formázás megadásával: SELECT SYS_XMLAGG(SYS_XMLGEN(dnev), SYS. XMLGen. Format. Type. Create. Format('SOROK')). get. String. Val() FROM dolgozo WHERE ROWNUM < 3; ----------<? xml version="1. 0"? > <SOROK> <DNEV>SMITH</DNEV> <DNEV>ALLEN</DNEV> </SOROK> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 22
DBMS_XMLGEN csomag • A következő példa a relációs lekérdezés eredményéből úgy csinál dokumentumot, hogy minden sorból lesz egy elem, a soron belüli oszlopokból pedig a sor alatt egy elem. • A sor-elem nevét is megadhatjuk, ha NULL-ra állítjuk, akkor nem lesz külön elem a sorokból. • Azt is megtehetjük, hogy a lekérdezésnek minden 3 (vagy tetszőleges n) sorából egy külön dokumentum készüljön. Részleteket lásd -> a package definícióban. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 23
DBMS_XMLGEN csomag CREATE TABLE temp. XML (azon NUMBER(4), o sys. xmltype); DECLARE kornyezet DBMS_XMLGEN. ctx. Handle; eredmeny CLOB; BEGIN kornyezet : = DBMS_XMLGEN. new. Context( 'SELECT region_name, country_name, city, street_address FROM hr. regions r, hr. countries c, hr. locations l WHERE l. country_id=c. country_id AND c. region_id=r. region_id AND region_name=”Europe” '); DBMS_XMLGEN. set. Row. Set. Tag(kornyezet, 'XMLDOK'); DBMS_XMLGEN. set. Row. Tag(kornyezet, 'SOR'); eredmeny : = DBMS_XMLGEN. get. XML(kornyezet); INSERT INTO temp. XML VALUES(1, SYS. XMLType. Create. XML(eredmeny)); COMMIT; DBMS_XMLGEN. close. Context(kornyezet); END; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 24
DBMS_XMLGEN csomag • A példa eredménye: ----------------------------<? xml version="1. 0"? > <XMLDOK> <SOR> <REGION_NAME>Europe</REGION_NAME> <COUNTRY_NAME>Italy</COUNTRY_NAME> <CITY>Roma</CITY> <STREET_ADDRESS>1297 Via Cola di Rie</STREET_ADDRESS> </SOR> <REGION_NAME>Europe</REGION_NAME> <COUNTRY_NAME>Italy</COUNTRY_NAME> <CITY>Venice</CITY> <STREET_ADDRESS>93091 Calle della Testa</STREET_ADDRESS> </SOR>. . . </XMLDOK> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 25
DBMS_XMLGEN csomag • Objektum-relációs tábla esetén viszont a dokumentum tükrözi az objektumok szerkezetét. • Minden objektumtípusból egy elem lesz, az attribútumokból pedig egy leszármazott elem. • A '@'-al kezdődő oszlopnevekből és attribútumnevekből (objektumok attribútumaiból) az adott XML elem attribútuma lesz. • Az alábbi példa rögtön XMLType typusú eredményt ad vissza és nem CLOB-ot, mint az előző. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 26
DBMS_XMLGEN csomag DECLARE kornyezet DBMS_XMLGEN. ctx. Handle; eredmeny SYS. XMLType; BEGIN kornyezet : = DBMS_XMLGEN. new. Context('SELECT nev "@nev", tagok FROM csapat'); DBMS_XMLGEN. set. Row. Set. Tag(kornyezet, 'XMLDOK'); DBMS_XMLGEN. set. Row. Tag(kornyezet, 'CSAPAT'); eredmeny : = DBMS_XMLGEN. get. XMLType(kornyezet); INSERT INTO temp. XML VALUES(2, eredmeny); COMMIT; DBMS_XMLGEN. close. Context(kornyezet); END; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 27
SELECT o AS csapatok FROM tempxml WHERE azon=2; CSAPATOK ---------------<? xml version="1. 0"? > <XMLDOK> <CSAPAT nev="Fradi"> <TAGOK> <SZEMELY_TYP> <NEV>Albert Flori</NEV> <CIM> <UTCA>Kicsi</UTCA> <VAROS>Bp</VAROS> </CIM> </SZEMELY_TYP> <NEV>Novak Dezso</NEV> <CIM> <UTCA>Nagy</UTCA> <VAROS>Vac</VAROS> </CIM> </SZEMELY_TYP> </TAGOK> </CSAPAT> <CSAPAT nev="Ujpest">. . . </CSAPAT> </XMLDOK> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 28
EXTRACT(XMLType, XPath) • Az XPath kifejezés által megjelölt elemeket (csomópontokat, részfákat) adja vissza dokumentumtöredékként. SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Docks') o 60 FROM warehouses WHERE warehouse_spec IS NOT NULL; WAREHOUSE_NAME -----------------Southlake, Texas San Francisco New Jersey Seattle, Washington Kiss Attila Master dr. Informatique Az Oracle XML DB O 60 --------<Docks>2</Docks> <Docks>1</Docks> <Docks>3</Docks> 2010. 02. 22. 29
EXTRACTVALUE(XMLType, XPath) • Hasonló az EXTRACT-hez, de ez az eredményt skalár értékként adja vissza. Épp ezért az XPath által megadott kifejezésnek egyetlen szöveges csomópontot vagy attribútumot kell eredményeznie, ellenkező esetben hibaüzenetet kapunk. SELECT warehouse_name, EXTRACTVALUE(warehouse_spec, '/Warehouse/Docks') o 60 FROM warehouses WHERE warehouse_spec IS NOT NULL; WAREHOUSE_NAME -----------------Southlake, Texas San Francisco New Jersey Seattle, Washington Kiss Attila Master dr. Informatique Az Oracle XML DB O 60 --2 1 3 2010. 02. 22. 30
EXTRACTVALUE(XMLType, XPath) • Lekérdezhetünk vele levélcsomópontot vagy attribútumot. SELECT EXTRACTVALUE(kolcs_spec, '//Konyv[@cim="Tuskevar"]/Ar') FROM kolcsonzes WHERE azon=2; o 60 ---2500 SELECT EXTRACTVALUE(kolcs_spec, '//Konyv[@cim="Tuskevar"]/@szerzo') FROM kolcsonzes WHERE azon=2; o 60 ------Fekete Istvan Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 31
EXISTSNODE(XMLType, XPath) • 0 vagy 1 értékkel tér vissza attól függően, hogy a megadott XPath kifejezés eredményezett-e valamilyen csomópontot vagy attribútumot. SELECT warehouse_id, warehouse_name FROM oe. warehouses WHERE EXISTSNODE(warehouse_spec, '/Warehouse/Docks') = 1; WAREHOUSE_ID ------1 2 4 Kiss Attila Master dr. Informatique WAREHOUSE_NAME ---------Southlake, Texas San Francisco Seattle, Washington Az Oracle XML DB 2010. 02. 22. 32
XMLELEMENT(Elemnév [, érték] [, attribútumok]) • Hasonló a SYS_XMLGen-hez, egy XML elemet hoz létre. Itt megadhatunk attribútumokat is, és egymásba ágyazva is meghívhatjuk a függvényt. • Az első paraméter az elem nevét adja meg az alábbi példában. SELECT XMLELEMENT("last_name", e. last_name). get. Stringval() FROM hr. employees e WHERE e. employee_id IN (205, 206); ---------------<last_name>Gietz</last_name> <last_name>Higgins</last_name> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 33
XMLELEMENT(Elemnév [, érték] [, attribútumok]) • Attribútumot és beágyazott elemet hozunk létre. A második attribútum nevét az oszlopnévből származtatja, ha nem adtuk meg. SELECT XMLELEMENT("Emp", XMLATTRIBUTES(e. employee_id AS "ID", e. last_name), XMLELEMENT("Dept", e. department_id), XMLELEMENT("Salary", e. salary)) o 60 FROM hr. employees e WHERE e. employee_id = 206; O 60 ----------------<Emp ID="206" LAST_NAME="Gietz"> <Dept>110</Dept> <Salary>8300</Salary> </Emp> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 34
XMLELEMENT(Elemnév [, érték] [, attribútumok]) • Az alábbi lekérdezés kicsit még összetettebb. Fontos, hogy a beágyazott SELECT csak egyetlen sorral térjen vissza, különben hibás lenne. Az alias ("Dept_name") megadása is kötelező, különben nem tudná elnevezni az attribútumot. A beágyazott SELECT mellett további SELECT-ek is szerepelhetnének még, pl. a location_id-t is lekérdezhetnénk. SELECT XMLELEMENT("Emp", XMLATTRIBUTES(e. employee_id, e. last_name), XMLELEMENT("Dept", XMLATTRIBUTES(e. department_id, (SELECT d. department_name FROM hr. departments d WHERE d. department_id = e. department_id) as "Dept_name")), XMLELEMENT("salary", e. salary), XMLELEMENT("Hiredate", e. hire_date)) AS "Emp Element" FROM hr. employees e WHERE employee_id = 205; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 35
XMLELEMENT(Elemnév [, érték] [, attribútumok]) • Az előbbi lekérdezés eredménye: Emp Element ----------------<Emp EMPLOYEE_ID="205" LAST_NAME="Higgins"> <Dept DEPARTMENT_ID="110" Dept_name="Accounting"></Dept> <salary>12000</salary> <Hiredate>1994 -06 -07</Hiredate> </Emp> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 36
XMLCONCAT(XMLType, . . . ) • Összefűzi a paraméterül kapott elemeket egy sorozattá. Épp az ellenkezőjét csinálja, mint az XMLSequence. SELECT employee_id, XMLCONCAT(XMLELEMENT("First", e. first_name), XMLELEMENT("Last", e. last_name)) o 60 FROM hr. employees e WHERE e. employee_id > 202; EMPLOYEE_ID -----203 204 205 206 Kiss Attila Master dr. Informatique O 60 ---------------------<First>Susan</First><Last>Mavris</Last> <First>Hermann</First><Last>Baer</Last> <First>Shelley</First><Last>Higgins</Last> <First>William</First><Last>Gietz</Last> Az Oracle XML DB 2010. 02. 22. 37
XMLSEQUENCE(XMLType) • A dokumentumtöredékekből dinamikus tömböt (VARRAY) hoz létre, amelynek elemei XML dokumentumok. SELECT EXTRACT(kolcs_spec, '//Konyv/@cim'). get. String. Val() FROM kolcsonzes WHERE azon=2; ------Momo. Tuskevar • • Az alábbi VARRAY-t ad vissza, amit a kliens programok nem tudnak megjeleníteni. A lekérdezés(ek) eredménye 1 sor, amiben egy XML-eket tartalmazó VARRAY van. Valójában ez egy üres VARRAY lesz, ahogy majd lejjebb látni fogjuk, mivel nem dokumentumtöredék amivel fel kellene tölteni. SELECT XMLSequence(EXTRACT(k. kolcs_spec, '//Konyv/@cim')) FROM kolcsonzes k WHERE azon=2; SELECT XMLSequence(EXTRACT(k. kolcs_spec, '//Konyv/AR/text()')) FROM kolcsonzes k WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 38
XMLSEQUENCE(XMLType) • A tömböt táblává alakíthatjuk és lekérdezhetjük. Mivel a TABLE által létrejött táblának nincs oszlopa, ezért azt a VALUE(t) hivatkozással vagy COLUMN_VALUE hivatkozással kérdezhetjük le. • A lekérdezés 2 sort ad vissza. SELECT value(t) FROM TABLE(SELECT XMLSequence(EXTRACT(k. kolcs_spec, '//Konyv')) FROM kolcsonzes k WHERE azon=2) t; ----------------------<Konyv cim="Momo" szerzo="Michael Ende"> <Ar>2000</Ar> </Konyv> <Konyv cim="Tuskevar" szerzo="Fekete Istvan"> <Ar>2500</Ar> </Konyv> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 39
XMLSEQUENCE(XMLType) • Az alábbi lekérdezés is 2 sort ad vissza. A VARRAY 2 XML elemből áll. SELECT value(t) FROM TABLE(SELECT XMLSequence(EXTRACT(k. kolcs_spec, '//Konyv/Ar')) FROM kolcsonzes k WHERE azon=2) t; ------<Ar>2000</Ar> <Ar>2500</Ar> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 40
XMLSEQUENCE(XMLType) • Az attribútumokból vagy szöveges tartalmakból azonban 0 elemű tömb lesz, vagyis ezekkel nem tölti fel a VARRAY-t az XMLSequence. SELECT count(*) FROM TABLE(SELECT XMLSequence(EXTRACT(k. kolcs_spec, '//Konyv/Ar/text()')) FROM kolcsonzes k WHERE azon=2) t; ------0 SELECT count(*) FROM TABLE(SELECT XMLSequence(EXTRACT(k. kolcs_spec, '//Konyv/@cim')) FROM kolcsonzes k WHERE azon=2) t; ------0 Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 41
Külső XML adatok beolvasása • Az alábbi utasítás egy külső fájlból beolvasott adatokat XML-lé konvertál. • A BFILENAME függvény egy lokátort ad vissza, amit az XMLType konstruktor függvény használ fel. SELECT XMLType(bfilename('INFOKEZ 3', 'kolcsonzesek. xml'), nls_charset_id('EE 8 ISO 8859 P 2')). get. String. Val() FROM dual; • Ez pedig be is teszi egy táblába a külső fájlból olvasott XML-t. INSERT INTO temp. XML VALUES (2, XMLType(bfilename('INFOKEZ 3', 'kolcsonzesek. xml'), nls_charset_id('EE 8 ISO 8859 P 2'))); Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 42
XML adatok módosítása • Hozzunk létre még egy sort a táblában, amelyben most csak Gipsz Jakab kölcsönzései lesznek benne. A továbbiakban ezt a 2 -es azonosítójú sort fogjuk módosítgatni. INSERT INTO kolcsonzes SELECT 2, EXTRACT(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]') FROM kolcsonzes; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 43
DELETEXML(XMLType, XPath) • Kitörli a megadott csomópontokat (és az alattuk levő részfát is) vagy attribútumokat. • Töröljük ki a Momo-ra vonatkozó kölcsönzést SELECT DELETEXML(kolcs_spec, '//Konyv[@cim="Momo"]') FROM kolcsonzes WHERE azon=2; • Töröljük ki a könyvek 'cim' attribútumait SELECT DELETEXML(kolcs_spec, '//Konyv/@cim') FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 44
APPENDCHILDXML(XMLType, XPath, Value) • A megadott helyekre csomópontokat szúr be azok gyermek csomópontjaként. • Szúrjunk be egy újabb könyvet Gipsz Jakab Konyvek csomópontja alá. A könyvek között a most beszúrt lesz az utolsó. SELECT APPENDCHILDXML(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]/Konyvek', XMLType( '<Konyv cim="Rokonok" szerzo="Moricz Zsigmond"> <Ar>2400</Ar> </Konyv>')) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 45
APPENDCHILDXML(XMLType, XPath, Value) • Egy gyermek nélküli csomópontot megadhatunk az alábbi rövidített módon is SELECT APPENDCHILDXML(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]/Konyvek', XMLType( '<Konyv cim="Rokonok" szerzo="Moricz Zsigmond"/>')) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 46
INSERTCHILDXML(XMLType, XPath, Value, XML) • A 3. paraméterben megadott típusú csomópontok közé szúr be utolsónak még egyet az XPath kifejezés által kijelölt csomópont gyermekeként. • Új DVD-k csomópont beszúrása SELECT INSERTCHILDXML(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]', 'DVD-k', XMLType('<DVD-k> <DVD ar="5000">Kill Bill</DVD> </DVD-k>')) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 47
INSERTCHILDXML(XMLType, XPath, Value, XML) • Új DVD-k csomópont más szerkezettel, új attribútummal: SELECT INSERTCHILDXML(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]', 'DVD-k', XMLType('<DVD-k ujattr="100"></DVD-k>')) FROM kolcsonzes WHERE azon=2; • Új CD-k csomópont beszúrása: SELECT INSERTCHILDXML(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]', 'CD-k', XMLType('<CD-k> <CD eloado="Kormoran"> <Cim>Kapuk</Cim> <Ar>3000</Ar> </CD-k>')) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 48
INSERTXMLBEFORE(XMLType, XPath, XML) • Az XPath kifejezés által megadott csomópontok elé szúr be egy elemet. • Szúrjunk be a két könyv közé még egyet. SELECT INSERTXMLBEFORE(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]//Konyv[2]', XMLType( '<Konyv cim="Rokonok" szerzo="Moricz Zsigmond"> <Ar>2400</Ar> </Konyv>')) FROM kolcsonzes WHERE azon=2; • Minden Ar csomópont elé szúrjunk be. SELECT INSERTXMLBEFORE(kolcs_spec, '//Ar', XMLType('<Ar_jon osszeg="Occso">Blabla</Ar_jon>')) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 49
UPDATEXML(XMLType, XPath, Value) • A megadott részt módosítja a dokumentumon belül. Módosíthatunk attribútum értéket, elem tartalmat is. • Cseréljük le a Tuskevar könyvet egy másikra SELECT UPDATEXML(kolcs_spec, '//Konyv[@cim="Tuskevar"]', XMLType( '<Konyv cim="Rokonok" szerzo="Moricz Zsigmond"> <Ar>2400</Ar> </Konyv>')) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 50
UPDATEXML(XMLType, XPath, Value) • Módosítsuk a Tuskevar konyv címét. SELECT UPDATEXML(kolcs_spec, '//Konyv[@cim="Tuskevar"]/@cim', 'Uj_tuskevar') FROM kolcsonzes WHERE azon=2; • Állítsuk üres-re a cim attribútumot. SELECT UPDATEXML(kolcs_spec, '//Konyv[@cim="Tuskevar"]/@cim', NULL) FROM kolcsonzes WHERE azon=2; • Az alábbi üres elemet csinál a Tuskevar könyvből. SELECT UPDATEXML(kolcs_spec, '//Konyv[@cim="Tuskevar"]', NULL) FROM kolcsonzes WHERE azon=2; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 51
Oracle XML indexelés • • Függvény-alapú indexelés XMLindex Szövegindexek (Oracle Text indexes ) Oracle 11 g előtt: CTXXPath Indexes – nem fejlesztik tovább, helyette van az XMLindex Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 52
Függvény-alapú indexelés • Akkor használható, ha az XPath kifejezés egyetlen csúcsot (elemet, vagy attribútumot) ad vissza. • B-fát vagy bitmap indexet lehet használni. • Akkor hasznos, ha ugyanazt az XPath lekérdezést sokszor használjuk WHERE feltételekben. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 53
Függvény-alapú index CREATE TABLE po_clob OF XMLType XMLTYPE STORE AS CLOB ELEMENT "http: //localhost: 8080/source/schemas/po. Source/xsd/purchase. Orde r. xsd#Purchase. Order"; Table created. INSERT INTO po_clob SELECT OBJECT_VALUE FROM OE. purchaseorder; 132 rows created. CREATE UNIQUE INDEX po_fn_based_ix ON po_clob (extract. Value(OBJECT_VALUE, '/Purchase. Order/Reference')); Index created. INSERT INTO po_clob VALUES (XMLType(bfilename('XMLDIR', 'EABEL 20021009123335791 PDT. xml'), nls_charset_id('AL 32 UTF 8'))); INSERT INTO po_clob * ERROR at line 1: ORA-00001: unique constraint (OE. PO_FN_BASED_IX) violated Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 54
Függvény-alapú index • Az exists. Node nem használja fel az indexet. EXPLAIN PLAN FOR SELECT OBJECT_VALUE FROM po_clob WHERE exists. Node(OBJECT_VALUE, '/Purchase. Order[Reference="EABEL 20021009123335791 PDT"') = 1; Explained. SET ECHO OFF PLAN_TABLE_OUTPUT ---------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU) | Time ----------------------------| 0 | SELECT STATEMENT | | 42 | 84084 | 23 (27)|00: 01| |* 1| TABLE ACCESS FULL| PO_CLOB | 42 | 84084 | 23 (27)|00: 01| --------------------------------- Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 55
Függvény-alapú index • A következő lekérdezés már használja az indexet. EXPLAIN PLAN FOR SELECT OBJECT_VALUE FROM po_clob WHERE extract. Value(OBJECT_VALUE, '/Purchase. Order/Reference') = 'EABEL-20021009123335791 PDT'; Explained. SET ECHO OFF PLAN_TABLE_OUTPUT -------------------------------------| Id | Operation Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------| 0 | SELECT STATEMENT | | 1 | 2002 |1 (0)|00: 01 | | 1 | TABLE ACCESS BY INDEX ROWID| PO_CLOB | 1| 2002 |1 (0)|00: 01 | |* 2 | INDEX UNIQUE SCAN | PO_FN_BASED_IX |1 | |0 (0)|00: 01 | --------------------------------------Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 56
XMLIndex • Az XML-re vonatkozó összes XPath kifejezést tartalmazza, emiatt nagyon nagy méretű is lehet. • XMLQuery, XMLTable, XMLExists, XMLCast, extract. Value és exists. Node esetén is kihasználhatja a lekérdezés-optimalizátor ezt az indexet. • Akkor is használható, ha az XPath lekérdezés eredménye nem egyelemű. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 57
XMLIndex • Néhány eset, amikor nem használható: – felhasználó által definiált XPath függvények – child, descendant és attribute irányoktól eltérő irányok – uniót ( | ) használó kifejezések • Az XMLIndex 3 komponensből áll – Útvonalindex (path index) – Címkéző index (order index) – Értékindex (value index) Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 58
XMLIndex Path Table szerkezete Column Data Type PATHID RAW(8) RID ROWID ORDER_KEY RAW(1000) LOCATOR RAW(2000) VALUE VARCHAR 2(4000) • A Locator a töredék gyorsabb eléréséhez szükséges mutató. Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 59
XMLIndex Path Table szerkezete <Purchase. Order> <Reference>SBELL-2002100912333601 PDT</Reference> <Actions> <Action> <User>SVOLLMAN</User> </Actions>. . . </Purchase. Order> <Reference>ABEL-20021127121040897 PST</Reference> <Actions> <Action> <User>ZLOTKEY</User> </Action> <User>KING</User> </Actions>. . . </Purchase. Order> Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 60
XMLIndex Path Table szerkezete PATHID 1 2 3 4 5 Kiss Attila Master dr. Informatique Indexed XPath /Purchase. Order/Reference /Purchase. Order/Actions/Action/User Az Oracle XML DB 2010. 02. 22. 61
XMLIndex Path Table szerkezete PATHID 1 2 3 4 5 4 5 Kiss Attila Master dr. Informatique RID R 1 R 1 R 1 R 2 R 2 ORDER_KEY VALUE 1 1. 2 1. 2. 1. 1 1. 2. 2. 1 —— Az Oracle XML DB SBELL-2002100912333601 PDT —— —— SVOLLMAN —— ABEL-20021127121040897 PST —— —— ZLOTKEY —— KING 2010. 02. 22. 62
XMLIndex Path Table <po> <data> <item>foo</item> <pkg>123</pkg> <item>bar</item> </data> </po> Order. Key Value Locator Num. Value po. data 1 Rid 1 po. data. item 1. 1 Rid 1 po. data. pkg 1. 2 7 “foo” 18 “ 123” 39 123 Rid 1 po. data. item 1. 3 “bar” 58 Rid Path Rid 1 po Rid 1 Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 63
Az Order. Key (Dewey Order) 1 1. 1 person name child 1. 2. 1 name 1. 2. 1. 1 Kiss Attila Master dr. Informatique 1. 2 person hobby 1. 2 Az Oracle XML DB hobby 1. 2. 1. 3 2010. 02. 22. 64
XMLIndex készítése CREATE INDEX po_xmlindex_ix ON po_clob (OBJECT_VALUE) INDEXTYPE IS XDB. XMLIndex; CREATE INDEX po_xmlindex_hybrid_ix ON li_clob (extract(OBJECT_VALUE, '/Purchase. Order/Line. Items')) INDEXTYPE IS XDB. XMLIndex; Kiss Attila Master dr. Informatique Az Oracle XML DB 2010. 02. 22. 65
- Slides: 65