Az Oracle XML DB

65
Master Informatique 2010.02.22. 1 dr. Kiss Attila Az Oracle XML DB Az Oracle XML DB

description

Az Oracle XML DB. Az előadás vázlata. XML típusú mező definiálása, XML adatok beszúrása, lekérdezése * XML sortípus használata * XML függvények használata * XMLIndexek használata Összefoglalás * (Nikovits Tibor gyakorlatainak anyaga). XML típusú mező. - PowerPoint PPT Presentation

Transcript of Az Oracle XML DB

Page 1: Az Oracle XML DB

Master Informatique 2010.02.22. 1dr. Kiss Attila Az Oracle XML DB

Az Oracle XML DB

Page 2: Az Oracle XML DB

Master Informatique 2010.02.22. 2dr. Kiss Attila Az Oracle XML DB

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álata5. Összefoglalás

* (Nikovits Tibor gyakorlatainak anyaga)

Page 3: Az Oracle XML DB

Master Informatique 2010.02.22. 3dr. Kiss Attila Az Oracle XML DB

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 VARCHAR2(35 BYTE),

epulet_azon NUMBER(4) );

Page 4: Az Oracle XML DB

Master Informatique 2010.02.22. 4dr. Kiss Attila Az Oracle XML DB

XML beszúrása

• A beszúrás a CreateXML metódussal történik.

INSERT INTO raktar VALUES(1, SYS.XMLType.CreateXML('<?xml version="1.0"?> <Raktar> <Tulaj>Sajat</Tulaj> <Terulet>25000</Terulet> <Folyoviz>Igen</Folyoviz> <Vasut>Nem</Vasut> <Parkolas>Utca</Parkolas> </Raktar>'), 'raktar1', '1000');

Page 5: Az Oracle XML DB

Master Informatique 2010.02.22. 5dr. Kiss Attila Az Oracle XML DB

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>

Page 6: Az Oracle XML DB

Master Informatique 2010.02.22. 6dr. Kiss Attila Az Oracle XML DB

XML típus átalakítása karaktertípussá

• Egy XML dokumentumot karakter típusú adattá konvertálhatunk a getStringVal metódussal, vagy CLOB-bá a getCLobVal függvénnyel.

SELECT r.raktar_azon, r.raktar_spec.EXTRACT('/Raktar/Terulet').getStringval() Eredmeny FROM raktar r WHERE r.raktar_azon=1;

RAKTAR_AZON Eredmeny ----------- --------

1 <Terulet>25000</Terulet>

Page 7: Az Oracle XML DB

Master Informatique 2010.02.22. 7dr. Kiss Attila Az Oracle XML DB

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

Page 8: Az Oracle XML DB

Master Informatique 2010.02.22. 8dr. Kiss Attila Az Oracle XML DB

XML elem értékének kiolvasása• A text() értéket a getStringVal, getNumberVal metódusokkal

lehet átalakítani.

SELECT r.raktar_azon, r.raktar_spec.extract('/Raktar/Tulaj/text()').getStringval() Eredmeny, r.raktar_spec.extract('/Raktar/Terulet/text()').getNumberval() Eredmeny2FROM raktar r WHERE r.raktar_azon=1;

RAKTAR_AZON Eredmeny Eredmeny2----------- ------------------- ---------- 1 Sajat 25000

Page 9: Az Oracle XML DB

Master Informatique 2010.02.22. 9dr. Kiss Attila Az Oracle XML DB

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;

Page 10: Az Oracle XML DB

Master Informatique 2010.02.22. 10dr. Kiss Attila Az Oracle XML DB

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>

Page 11: Az Oracle XML DB

Master Informatique 2010.02.22. 11dr. Kiss Attila Az Oracle XML DB

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>

Page 12: Az Oracle XML DB

Master Informatique 2010.02.22. 12dr. Kiss Attila Az Oracle XML DB

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>

Page 13: Az Oracle XML DB

Master Informatique 2010.02.22. 13dr. Kiss Attila Az Oracle XML DB

DTD használata• Az érvényességhez DTD-t adhatunk meg.

INSERT INTO kolcsonzes VALUES(3, SYS.XMLType.CreateXML( '<?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"/>

Page 14: Az Oracle XML DB

Master Informatique 2010.02.22. 14dr. Kiss Attila Az Oracle XML DB

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.

Page 15: Az Oracle XML DB

Master Informatique 2010.02.22. 15dr. Kiss Attila Az Oracle XML DB

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.

Page 16: Az Oracle XML DB

Master Informatique 2010.02.22. 16dr. Kiss Attila Az Oracle XML DB

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>

Page 17: Az Oracle XML DB

Master Informatique 2010.02.22. 17dr. Kiss Attila Az Oracle XML DB

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').getStringVal() 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')).getStringVal() 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>

Page 18: Az Oracle XML DB

Master Informatique 2010.02.22. 18dr. Kiss Attila Az Oracle XML DB

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()').getStringVal() FROM kolcsonzes WHERE azon=1;

-------------------------JegkorszakShrekUvegtigris

SELECT SYS_XMLGEN(EXTRACT(kolcs_spec, '//DVD/text()')).getStringVal() FROM kolcsonzes WHERE azon=1;

---------------------------<?xml version="1.0"?><ROW>JegkorszakShrekUvegtigris</ROW>

Page 19: Az Oracle XML DB

Master Informatique 2010.02.22. 19dr. Kiss Attila Az Oracle XML DB

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.XMLGenFormatType.CreateFormat('ELEM')).getStringVal() FROM kolcsonzes WHERE azon=1;

-----------------------------<?xml version="1.0"?><ELEM>JegkorszakShrekUvegtigris</ELEM>

Page 20: Az Oracle XML DB

Master Informatique 2010.02.22. 20dr. Kiss Attila Az Oracle XML DB

Objektumok lekérdezéseSELECT 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> <SZEMELY_TYP> <NEV>Novak Dezso</NEV> <CIM> <UTCA>Nagy</UTCA> <VAROS>Vac</VAROS> <ORSZAG>Magyar</ORSZAG> <IRSZAM>4321</IRSZAM> </CIM> </SZEMELY_TYP></TAGOK>

Page 21: Az Oracle XML DB

Master Informatique 2010.02.22. 21dr. Kiss Attila Az Oracle XML DB

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)).getStringVal() FROM dolgozo WHERE ROWNUM < 3;

---------------------<?xml version="1.0"?><ROWSET> <DNEV>SMITH</DNEV> <DNEV>ALLEN</DNEV></ROWSET>

Page 22: Az Oracle XML DB

Master Informatique 2010.02.22. 22dr. Kiss Attila Az Oracle XML DB

SYS_XMLAGG(kif [,fmt]) függvény

• Ugyanez formázás megadásával:

SELECT SYS_XMLAGG(SYS_XMLGEN(dnev),

SYS.XMLGenFormatType.CreateFormat('SOROK')).getStringVal() FROM dolgozo WHERE ROWNUM < 3;

---------------------<?xml version="1.0"?><SOROK> <DNEV>SMITH</DNEV> <DNEV>ALLEN</DNEV></SOROK>

Page 23: Az Oracle XML DB

Master Informatique 2010.02.22. 23dr. Kiss Attila Az Oracle XML DB

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.

Page 24: Az Oracle XML DB

Master Informatique 2010.02.22. 24dr. Kiss Attila Az Oracle XML DB

DBMS_XMLGEN csomagCREATE TABLE tempXML (azon NUMBER(4), o sys.xmltype);

DECLARE kornyezet DBMS_XMLGEN.ctxHandle; eredmeny CLOB;BEGIN kornyezet := DBMS_XMLGEN.newContext( '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.setRowSetTag(kornyezet, 'XMLDOK'); DBMS_XMLGEN.setRowTag(kornyezet, 'SOR'); eredmeny := DBMS_XMLGEN.getXML(kornyezet); INSERT INTO tempXML VALUES(1, SYS.XMLType.CreateXML(eredmeny)); COMMIT; DBMS_XMLGEN.closeContext(kornyezet);END;

Page 25: Az Oracle XML DB

Master Informatique 2010.02.22. 25dr. Kiss Attila Az Oracle XML DB

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> <SOR> <REGION_NAME>Europe</REGION_NAME> <COUNTRY_NAME>Italy</COUNTRY_NAME> <CITY>Venice</CITY> <STREET_ADDRESS>93091 Calle della Testa</STREET_ADDRESS> </SOR>...</XMLDOK>

Page 26: Az Oracle XML DB

Master Informatique 2010.02.22. 26dr. Kiss Attila Az Oracle XML DB

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ő.

Page 27: Az Oracle XML DB

Master Informatique 2010.02.22. 27dr. Kiss Attila Az Oracle XML DB

DBMS_XMLGEN csomagDECLARE kornyezet DBMS_XMLGEN.ctxHandle; eredmeny SYS.XMLType;BEGIN kornyezet := DBMS_XMLGEN.newContext('SELECT nev

"@nev",tagok FROM csapat'); DBMS_XMLGEN.setRowSetTag(kornyezet, 'XMLDOK'); DBMS_XMLGEN.setRowTag(kornyezet, 'CSAPAT'); eredmeny := DBMS_XMLGEN.getXMLType(kornyezet); INSERT INTO tempXML VALUES(2, eredmeny); COMMIT; DBMS_XMLGEN.closeContext(kornyezet);END;

Page 28: Az Oracle XML DB

Master Informatique 2010.02.22. 28dr. Kiss Attila Az Oracle XML DB

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> <SZEMELY_TYP> <NEV>Novak Dezso</NEV> <CIM> <UTCA>Nagy</UTCA> <VAROS>Vac</VAROS> </CIM> </SZEMELY_TYP> </TAGOK> </CSAPAT> <CSAPAT nev="Ujpest"> ... </CSAPAT></XMLDOK>

Page 29: Az Oracle XML DB

Master Informatique 2010.02.22. 29dr. Kiss Attila Az Oracle XML DB

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') o60 FROM warehouses WHERE warehouse_spec IS NOT NULL;

WAREHOUSE_NAME O60----------------------------------- ----------------Southlake, Texas <Docks>2</Docks>San Francisco <Docks>1</Docks>New JerseySeattle, Washington <Docks>3</Docks>

Page 30: Az Oracle XML DB

Master Informatique 2010.02.22. 30dr. Kiss Attila Az Oracle XML DB

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') o60 FROM warehouses WHERE warehouse_spec IS NOT NULL;

WAREHOUSE_NAME O60----------------------------------- ---Southlake, Texas 2San Francisco 1New JerseySeattle, Washington 3

Page 31: Az Oracle XML DB

Master Informatique 2010.02.22. 31dr. Kiss Attila Az Oracle XML DB

EXTRACTVALUE(XMLType, XPath)• Lekérdezhetünk vele levélcsomópontot vagy attribútumot.

SELECT EXTRACTVALUE(kolcs_spec, '//Konyv[@cim="Tuskevar"]/Ar') o60

FROM kolcsonzes WHERE azon=2;

o60----2500

SELECT EXTRACTVALUE(kolcs_spec, '//Konyv[@cim="Tuskevar"]/@szerzo') o60

FROM kolcsonzes WHERE azon=2;

o60-------------Fekete Istvan

Page 32: Az Oracle XML DB

Master Informatique 2010.02.22. 32dr. Kiss Attila Az Oracle XML DB

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 WAREHOUSE_NAME------------ ------------------- 1 Southlake, Texas 2 San Francisco 4 Seattle, Washington

Page 33: Az Oracle XML DB

Master Informatique 2010.02.22. 33dr. Kiss Attila Az Oracle XML DB

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).getStringval() FROM hr.employees e

WHERE e.employee_id IN (205, 206);

------------------------------<last_name>Gietz</last_name><last_name>Higgins</last_name>

Page 34: Az Oracle XML DB

Master Informatique 2010.02.22. 34dr. Kiss Attila Az Oracle XML DB

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)) o60FROM hr.employees eWHERE e.employee_id = 206;

O60--------------------------------<Emp ID="206" LAST_NAME="Gietz"> <Dept>110</Dept> <Salary>8300</Salary></Emp>

Page 35: Az Oracle XML DB

Master Informatique 2010.02.22. 35dr. Kiss Attila Az Oracle XML DB

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 eWHERE employee_id = 205;

Page 36: Az Oracle XML DB

Master Informatique 2010.02.22. 36dr. Kiss Attila Az Oracle XML DB

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>

Page 37: Az Oracle XML DB

Master Informatique 2010.02.22. 37dr. Kiss Attila Az Oracle XML DB

XMLCONCAT(XMLType, 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)) o60

FROM hr.employees eWHERE e.employee_id > 202;

EMPLOYEE_ID O60----------- ------------------------------------------ 203 <First>Susan</First><Last>Mavris</Last> 204 <First>Hermann</First><Last>Baer</Last> 205 <First>Shelley</First><Last>Higgins</Last> 206 <First>William</First><Last>Gietz</Last>

Page 38: Az Oracle XML DB

Master Informatique 2010.02.22. 38dr. Kiss Attila Az Oracle XML DB

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').getStringVal() FROM kolcsonzes WHERE azon=2;

------------MomoTuskevar

• 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;

Page 39: Az Oracle XML DB

Master Informatique 2010.02.22. 39dr. Kiss Attila Az Oracle XML DB

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>

Page 40: Az Oracle XML DB

Master Informatique 2010.02.22. 40dr. Kiss Attila Az Oracle XML DB

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>

Page 41: Az Oracle XML DB

Master Informatique 2010.02.22. 41dr. Kiss Attila Az Oracle XML DB

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

Page 42: Az Oracle XML DB

Master Informatique 2010.02.22. 42dr. Kiss Attila Az Oracle XML DB

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('INFOKEZ3','kolcsonzesek.xml'),

nls_charset_id('EE8ISO8859P2')).getStringVal()FROM dual;

• Ez pedig be is teszi egy táblába a külső fájlból olvasott XML-t.

INSERT INTO tempXMLVALUES (2, XMLType(bfilename('INFOKEZ3',

'kolcsonzesek.xml'), nls_charset_id('EE8ISO8859P2')));

Page 43: Az Oracle XML DB

Master Informatique 2010.02.22. 43dr. Kiss Attila Az Oracle XML DB

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;

Page 44: Az Oracle XML DB

Master Informatique 2010.02.22. 44dr. Kiss Attila Az Oracle XML DB

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éstSELECT DELETEXML(kolcs_spec, '//Konyv[@cim="Momo"]') FROM kolcsonzes WHERE azon=2;

• Töröljük ki a könyvek 'cim' attribútumaitSELECT DELETEXML(kolcs_spec, '//Konyv/@cim') FROM kolcsonzes WHERE azon=2;

Page 45: Az Oracle XML DB

Master Informatique 2010.02.22. 45dr. Kiss Attila Az Oracle XML DB

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;

Page 46: Az Oracle XML DB

Master Informatique 2010.02.22. 46dr. Kiss Attila Az Oracle XML DB

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;

Page 47: Az Oracle XML DB

Master Informatique 2010.02.22. 47dr. Kiss Attila Az Oracle XML DB

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;

Page 48: Az Oracle XML DB

Master Informatique 2010.02.22. 48dr. Kiss Attila Az Oracle XML DB

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> </CD-k>'))FROM kolcsonzes WHERE azon=2;

Page 49: Az Oracle XML DB

Master Informatique 2010.02.22. 49dr. Kiss Attila Az Oracle XML DB

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;

Page 50: Az Oracle XML DB

Master Informatique 2010.02.22. 50dr. Kiss Attila Az Oracle XML DB

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;

Page 51: Az Oracle XML DB

Master Informatique 2010.02.22. 51dr. Kiss Attila Az Oracle XML DB

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;

Page 52: Az Oracle XML DB

Master Informatique 2010.02.22. 52dr. Kiss Attila Az Oracle XML DB

Oracle XML indexelés

• Függvény-alapú indexelés

• XMLindex

• Szövegindexek (Oracle Text indexes )

• Oracle 11g előtt: CTXXPath Indexes – nem fejlesztik tovább, helyette van az

XMLindex

Page 53: Az Oracle XML DB

Master Informatique 2010.02.22. 53dr. Kiss Attila Az Oracle XML DB

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.

Page 54: Az Oracle XML DB

Master Informatique 2010.02.22. 54dr. Kiss Attila Az Oracle XML DB

Függvény-alapú indexCREATE TABLE po_clob OF XMLType XMLTYPE STORE AS CLOB ELEMENT "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd#PurchaseOrder";

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 (extractValue(OBJECT_VALUE, '/PurchaseOrder/Reference'));

Index created.

INSERT INTO po_clob VALUES (XMLType(bfilename('XMLDIR', 'EABEL-20021009123335791PDT.xml'), nls_charset_id('AL32UTF8')));

INSERT INTO po_clob * ERROR at line 1: ORA-00001: unique constraint (OE.PO_FN_BASED_IX) violated

Page 55: Az Oracle XML DB

Master Informatique 2010.02.22. 55dr. Kiss Attila Az Oracle XML DB

Függvény-alapú index• Az existsNode nem használja fel az indexet.

EXPLAIN PLAN FOR SELECT OBJECT_VALUE FROM po_clob WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[Reference="EABEL-20021009123335791PDT"') = 1;

Explained.

SET ECHO OFF

PLAN_TABLE_OUTPUT -------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU) | Time---------------------------------------------------------| 0 | SELECT STATEMENT | | 42 | 84084 | 23 (27)|00:00:01||* 1| TABLE ACCESS FULL| PO_CLOB | 42 | 84084 | 23 (27)|00:00:01| -----------------------------------------------------------------

Page 56: Az Oracle XML DB

Master Informatique 2010.02.22. 56dr. Kiss Attila Az Oracle XML DB

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 extractValue(OBJECT_VALUE, '/PurchaseOrder/Reference') =

'EABEL-20021009123335791PDT'; Explained. SET ECHO OFF PLAN_TABLE_OUTPUT --------------------------------------------------------------------------| Id | Operation Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 2002 |1 (0)|00:00:01

|| 1 | TABLE ACCESS BY INDEX ROWID| PO_CLOB | 1| 2002 |1 (0)|00:00:01

||* 2 | INDEX UNIQUE SCAN | PO_FN_BASED_IX |1 | |0 (0)|00:00:01

|----------------------------------------------------------------------------

-

Page 57: Az Oracle XML DB

Master Informatique 2010.02.22. 57dr. Kiss Attila Az Oracle XML DB

XMLIndex

• Az XML-re vonatkozó összes XPath kifejezést tartalmazza, emiatt nagyon nagy méretű is lehet.

• XMLQuery, XMLTable, XMLExists, XMLCast, extract, extractValue és existsNode 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ű.

Page 58: Az Oracle XML DB

Master Informatique 2010.02.22. 58dr. Kiss Attila Az Oracle XML DB

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)

Page 59: Az Oracle XML DB

Master Informatique 2010.02.22. 59dr. Kiss Attila Az Oracle XML DB

XMLIndex Path Table szerkezete

Column Data TypePATHID RAW(8)RID ROWIDORDER_KEY RAW(1000)LOCATOR RAW(2000)VALUE VARCHAR2(4000)

• A Locator a töredék gyorsabb eléréséhez szükséges mutató.

Page 60: Az Oracle XML DB

Master Informatique 2010.02.22. 60dr. Kiss Attila Az Oracle XML DB

XMLIndex Path Table szerkezete

<PurchaseOrder> <Reference>SBELL-2002100912333601PDT</Reference> <Actions>

<Action> <User>SVOLLMAN</User> </Action> </Actions> . . . </PurchaseOrder>

<PurchaseOrder> <Reference>ABEL-20021127121040897PST</Reference>

<Actions> <Action> <User>ZLOTKEY</User> </Action>

<Action> <User>KING</User> </Action> </Actions> . . . </PurchaseOrder>

Page 61: Az Oracle XML DB

Master Informatique 2010.02.22. 61dr. Kiss Attila Az Oracle XML DB

XMLIndex Path Table szerkezete

PATHID Indexed XPath

1 /PurchaseOrder

2 /PurchaseOrder/Reference

3 /PurchaseOrder/Actions

4 /PurchaseOrder/Actions/Action

5 /PurchaseOrder/Actions/Action/User

Page 62: Az Oracle XML DB

Master Informatique 2010.02.22. 62dr. Kiss Attila Az Oracle XML DB

XMLIndex Path Table szerkezete

PATHID RID ORDER_KEY VALUE1 R1 1 ——2 R1 1.1 SBELL-

2002100912333601PDT

3 R1 1.2 ——

4 R1 1.2.1 ——

5 R1 1.2.1.1 SVOLLMAN

6 R2 1 ——7 R2 1.1 ABEL-

20021127121040897PST

8 R2 1.2 ——

9 R2 1.2.1 ——

10 R2 1.2.1.1 ZLOTKEY

4 R2 1.2.2 ——

5 R2 1.2.2.1 KING

Page 63: Az Oracle XML DB

Master Informatique 2010.02.22. 63dr. Kiss Attila Az Oracle XML DB

XMLIndex Path Table

Rid Path OrderKey Value Locator NumValue

Rid1 po

Rid1 po.data 1 7Rid1 po.data.item 1.1 “foo” 18Rid1 po.data.pkg 1.2 “123” 39 123

Rid1 po.data.item 1.3 “bar” 58

<po> <data> <item>foo</item> <pkg>123</pkg> <item>bar</item> </data></po>

Page 64: Az Oracle XML DB

Master Informatique 2010.02.22. 64dr. Kiss Attila Az Oracle XML DB

Az OrderKey (Dewey Order)

name

name child

person

person

hobby hobby

1.1 1.2

1

1.2.1

1.2.1.1 1.2.1.2 1.2.1.3

Page 65: Az Oracle XML DB

Master Informatique 2010.02.22. 65dr. Kiss Attila Az Oracle XML DB

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, '/PurchaseOrder/LineItems'))

INDEXTYPE IS XDB.XMLIndex;