Az Oracle XML DB

Post on 19-Jan-2016

86 views 0 download

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

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

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)

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

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');

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>

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>

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

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

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;

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>

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>

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>

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"/>

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.

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.

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>

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>

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>

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>

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>

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>

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>

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.

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;

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>

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

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;

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>

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>

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

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

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

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>

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>

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;

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>

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>

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;

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>

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>

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

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')));

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;

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;

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;

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;

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;

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;

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;

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;

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;

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

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.

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

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

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

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

-

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

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)

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

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>

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

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

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>

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

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;