Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Master Informatique 20 10. 02. 22. 1 dr. Kiss AttilaAz Oracle XML DB.

Hasonló előadás


Az előadások a következő témára: "Master Informatique 20 10. 02. 22. 1 dr. Kiss AttilaAz Oracle XML DB."— Előadás másolata:

1 Master Informatique 20 10. 02. 22. 1 dr. Kiss AttilaAz Oracle XML DB

2 Master Informatique 20 10. 02. 22. 2 dr. Kiss AttilaAz 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álata 5.Összefoglalás * (Nikovits Tibor gyakorlatainak anyaga)

3 Master Informatique 20 10. 02. 22. 3 dr. Kiss AttilaAz 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) );

4 Master Informatique 20 10. 02. 22. 4 dr. Kiss AttilaAz 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( ' Sajat 25000 Igen Nem Utca '), 'raktar1', '1000');

5 Master Informatique 20 10. 02. 22. 5 dr. Kiss AttilaAz 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 Sajat

6 Master Informatique 20 10. 02. 22. 6 dr. Kiss AttilaAz 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').get Stringval() Eredmeny FROM raktar r WHERE r.raktar_azon=1; RAKTAR_AZON Eredmeny ----------- -------- 1 25000

7 Master Informatique 20 10. 02. 22. 7 dr. Kiss AttilaAz 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

8 Master Informatique 20 10. 02. 22. 8 dr. Kiss AttilaAz 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() Eredmeny2 FROM raktar r WHERE r.raktar_azon=1; RAKTAR_AZON Eredmeny Eredmeny2 ----------- ------------------- ---------- 1 Sajat 25000

9 Master Informatique 20 10. 02. 22. 9 dr. Kiss AttilaAz 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;

10 Master Informatique 20 10. 02. 22. 10 dr. Kiss AttilaAz 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 ----------------------------------... Vagy a fentivel ekvivalens alábbi módon: SELECT VALUE(k) FROM kolcsonzes_xmlt k; VALUE(k) ----------------------------------...

11 Master Informatique 20 10. 02. 22. 11 dr. Kiss AttilaAz 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) ----------------------------------...

12 Master Informatique 20 10. 02. 22. 12 dr. Kiss AttilaAz 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; ------------------------ Szep Holnap 3000

13 Master Informatique 20 10. 02. 22. 13 dr. Kiss AttilaAz Oracle XML DB DTD használata Az érvényességhez DTD-t adhatunk meg. INSERT INTO kolcsonzes VALUES(3, SYS.XMLType.CreateXML( ' <!DOCTYPE személy [ ]> ')); SELECT k.kolcs_spec.EXTRACT('/') FROM kolcsonzes k WHERE azon=3; ------------------------------------------

14 Master Informatique 20 10. 02. 22. 14 dr. Kiss AttilaAz 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.

15 Master Informatique 20 10. 02. 22. 15 dr. Kiss AttilaAz 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.

16 Master Informatique 20 10. 02. 22. 16 dr. Kiss AttilaAz Oracle XML DB SYS_XMLGEN(kif [,fmt]) függvény Példa: SELECT SYS_XMLGEN(dnev) FROM dolgozo WHERE ROWNUM < 3; --------------------- SMITH ALLEN

17 Master Informatique 20 10. 02. 22. 17 dr. Kiss AttilaAz 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; -------------------------------------------------------- Jegkorszak Shrek Uvegtigris SELECT SYS_XMLGEN(EXTRACT(kolcs_spec, '//DVD')).getStringVal() FROM kolcsonzes WHERE azon=1; --------------------------------- Jegkorszak Shrek Uvegtigris

18 Master Informatique 20 10. 02. 22. 18 dr. Kiss AttilaAz 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; --------------------------- JegkorszakShrekUvegtigris

19 Master Informatique 20 10. 02. 22. 19 dr. Kiss AttilaAz 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; ----------------------------- JegkorszakShrekUvegtigris

20 Master Informatique 20 10. 02. 22. 20 dr. Kiss AttilaAz Oracle XML DB Objektumok lekérdezése SELECT SYS_XMLGEN(TAGOK) FROM csapat WHERE nev='Fradi'; ---------------------------- Albert Flori Kicsi Bp Magyar 1234 Novak Dezso Nagy Vac Magyar 4321

21 Master Informatique 20 10. 02. 22. 21 dr. Kiss AttilaAz 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; --------------------- SMITH ALLEN

22 Master Informatique 20 10. 02. 22. 22 dr. Kiss AttilaAz 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; --------------------- SMITH ALLEN

23 Master Informatique 20 10. 02. 22. 23 dr. Kiss AttilaAz 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.

24 Master Informatique 20 10. 02. 22. 24 dr. Kiss AttilaAz Oracle XML DB DBMS_XMLGEN csomag CREATE 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;

25 Master Informatique 20 10. 02. 22. 25 dr. Kiss AttilaAz Oracle XML DB DBMS_XMLGEN csomag A példa eredménye: -------------------------------------------------------- Europe Italy Roma 1297 Via Cola di Rie Europe Italy Venice 93091 Calle della Testa...

26 Master Informatique 20 10. 02. 22. 26 dr. Kiss AttilaAz 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ő.

27 Master Informatique 20 10. 02. 22. 27 dr. Kiss AttilaAz Oracle XML DB DBMS_XMLGEN csomag DECLARE 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;

28 Master Informatique 20 10. 02. 22. 28 dr. Kiss AttilaAz Oracle XML DB SELECT o AS csapatok FROM tempxml WHERE azon=2; CSAPATOK ------------------------------ Albert Flori Kicsi Bp Novak Dezso Nagy Vac...

29 Master Informatique 20 10. 02. 22. 29 dr. Kiss AttilaAz 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 2 San Francisco 1 New Jersey Seattle, Washington 3

30 Master Informatique 20 10. 02. 22. 30 dr. Kiss AttilaAz 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 2 San Francisco 1 New Jersey Seattle, Washington 3

31 Master Informatique 20 10. 02. 22. 31 dr. Kiss AttilaAz 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

32 Master Informatique 20 10. 02. 22. 32 dr. Kiss AttilaAz 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

33 Master Informatique 20 10. 02. 22. 33 dr. Kiss AttilaAz 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); ------------------------------ Gietz Higgins

34 Master Informatique 20 10. 02. 22. 34 dr. Kiss AttilaAz 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)) o60 FROM hr.employees e WHERE e.employee_id = 206; O60 -------------------------------- 110 8300

35 Master Informatique 20 10. 02. 22. 35 dr. Kiss AttilaAz 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 e WHERE employee_id = 205;

36 Master Informatique 20 10. 02. 22. 36 dr. Kiss AttilaAz Oracle XML DB XMLELEMENT(Elemnév [,érték] [,attribútumok]) Az előbbi lekérdezés eredménye: Emp Element --------------------------------- 12000 1994-06-07

37 Master Informatique 20 10. 02. 22. 37 dr. Kiss AttilaAz 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 e WHERE e.employee_id > 202; EMPLOYEE_ID O60 ----------- ------------------------------------------ 203 Susan Mavris 204 Hermann Baer 205 Shelley Higgins 206 William Gietz

38 Master Informatique 20 10. 02. 22. 38 dr. Kiss AttilaAz 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;

39 Master Informatique 20 10. 02. 22. 39 dr. Kiss AttilaAz 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; --------------------------------------------- 2000 2500

40 Master Informatique 20 10. 02. 22. 40 dr. Kiss AttilaAz 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; ------------- 2000 2500

41 Master Informatique 20 10. 02. 22. 41 dr. Kiss AttilaAz 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

42 Master Informatique 20 10. 02. 22. 42 dr. Kiss AttilaAz 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 tempXML VALUES (2, XMLType(bfilename('INFOKEZ3', 'kolcsonzesek.xml'), nls_charset_id('EE8ISO8859P2')));

43 Master Informatique 20 10. 02. 22. 43 dr. Kiss AttilaAz 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;

44 Master Informatique 20 10. 02. 22. 44 dr. Kiss AttilaAz 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é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;

45 Master Informatique 20 10. 02. 22. 45 dr. Kiss AttilaAz 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( ' 2400 ')) FROM kolcsonzes WHERE azon=2;

46 Master Informatique 20 10. 02. 22. 46 dr. Kiss AttilaAz 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( ' ')) FROM kolcsonzes WHERE azon=2;

47 Master Informatique 20 10. 02. 22. 47 dr. Kiss AttilaAz 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(' Kill Bill ')) FROM kolcsonzes WHERE azon=2;

48 Master Informatique 20 10. 02. 22. 48 dr. Kiss AttilaAz 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(' ')) FROM kolcsonzes WHERE azon=2; Új CD-k csomópont beszúrása: SELECT INSERTCHILDXML(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]', 'CD-k', XMLType(' Kapuk 3000 ')) FROM kolcsonzes WHERE azon=2;

49 Master Informatique 20 10. 02. 22. 49 dr. Kiss AttilaAz 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( ' 2400 ')) FROM kolcsonzes WHERE azon=2; Minden Ar csomópont elé szúrjunk be. SELECT INSERTXMLBEFORE(kolcs_spec, '//Ar', XMLType(' Blabla ')) FROM kolcsonzes WHERE azon=2;

50 Master Informatique 20 10. 02. 22. 50 dr. Kiss AttilaAz 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( ' 2400 ')) FROM kolcsonzes WHERE azon=2;

51 Master Informatique 20 10. 02. 22. 51 dr. Kiss AttilaAz 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;

52 Master Informatique 20 10. 02. 22. 52 dr. Kiss AttilaAz 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

53 Master Informatique 20 10. 02. 22. 53 dr. Kiss AttilaAz 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.

54 Master Informatique 20 10. 02. 22. 54 dr. Kiss AttilaAz Oracle XML DB Függvény-alapú index CREATE TABLE po_clob OF XMLType XMLTYPE STORE AS CLOB ELEMENT "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrde r.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

55 Master Informatique 20 10. 02. 22. 55 dr. Kiss AttilaAz 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| -----------------------------------------------------------------

56 Master Informatique 20 10. 02. 22. 56 dr. Kiss AttilaAz 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 | -----------------------------------------------------------------------------

57 Master Informatique 20 10. 02. 22. 57 dr. Kiss AttilaAz 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ű.

58 Master Informatique 20 10. 02. 22. 58 dr. Kiss AttilaAz 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)

59 Master Informatique 20 10. 02. 22. 59 dr. Kiss AttilaAz Oracle XML DB XMLIndex Path Table szerkezete ColumnData Type PATHIDRAW(8) RIDROWID ORDER_KEYRAW(1000) LOCATORRAW(2000) VALUE VARCHAR2(4000) A Locator a töredék gyorsabb eléréséhez szükséges mutató.

60 Master Informatique 20 10. 02. 22. 60 dr. Kiss AttilaAz Oracle XML DB XMLIndex Path Table szerkezete SBELL-2002100912333601PDT SVOLLMAN... ABEL-20021127121040897PST ZLOTKEY KING...

61 Master Informatique 20 10. 02. 22. 61 dr. Kiss AttilaAz Oracle XML DB XMLIndex Path Table szerkezete PATHIDIndexed XPath 1/PurchaseOrder 2/PurchaseOrder/Reference 3/PurchaseOrder/Actions 4/PurchaseOrder/Actions/Action 5/PurchaseOrder/Actions/Action/User

62 Master Informatique 20 10. 02. 22. 62 dr. Kiss AttilaAz Oracle XML DB XMLIndex Path Table szerkezete PATHIDRIDORDER_KEYVALUE 1 R11 —— 2 R1 1.1 SBELL-2002100912333601PDT 3 R1 1.2—— 4 R1 1.2.1—— 5 R1 1.2.1.1SVOLLMAN 1 R2 1—— 2 R2 1.1 ABEL-20021127121040897PST 3 R2 1.2—— 4 R2 1.2.1—— 5 R2 1.2.1.1ZLOTKEY 4 R2 1.2.2—— 5 R2 1.2.2.1KING

63 Master Informatique 20 10. 02. 22. 63 dr. Kiss AttilaAz Oracle XML DB XMLIndex Path Table RidPath OrderKey ValueLocatorNumValue Rid1po Rid1po.data1 7 Rid1 po.data.item 1.1 “foo”18 Rid1 po.data.pkg 1.2 “123”39123 Rid1 po.data.item 1.3 “bar”58 foo 123 bar

64 Master Informatique 20 10. 02. 22. 64 dr. Kiss AttilaAz Oracle XML DB Az OrderKey (Dewey Order) name child person hobby 1.11.2 1 1.2.1 1.2.1.11.2.1.21.2.1.3

65 Master Informatique 20 10. 02. 22. 65 dr. Kiss AttilaAz 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;


Letölteni ppt "Master Informatique 20 10. 02. 22. 1 dr. Kiss AttilaAz Oracle XML DB."

Hasonló előadás


Google Hirdetések