saturs - web viewlai darba izpildē nebūtu problēmu ar to, ka oracle versija ir novecojusi...
TRANSCRIPT
RĪGAS TEHNISKĀ UNIVERSITĀTE
DATORZINĪBU UN INFORMĀCIJAS TEHNOLOĢIJU FAKULTĀTE
Lietišķo datorsistēmu institūts
Artūrs FEOKLISTOVS
XML DATU BĀZES IZVEIDOŠANA UN IZMANTOŠANA
Rīga - 2011
SATURS
SATURS..........................................................................................................................................2
Uzdevuma nostādne.........................................................................................................................3
1. XMLType tipa tabulas bez shēmas izmantošanas izveidošana...............................................4
2. Datu ievade izveidotajā tabulā.................................................................................................5
3. Vaicājumu definēšana un izpildīšana....................................................................................12
3.1. Xquery vaicājumi............................................................................................................12
3.2. PL/SQL vaicājumi..........................................................................................................13
3.3. SQL vaicājumi................................................................................................................14
4. XML dokumentu shēmas izveidošana un reģistrēšana datu bāzē.........................................16
4.1. XML shēmas veidošana glabāšanai tabulā strukturētā veidā..........................................16
4.2. XML shēmas veidošana glabāšanai tabulā nestrukturētā veidā......................................21
4.3. XML shēmas veidošana glabāšanai tabulā binārā veidā.................................................24
5. XMLType tipa tabulas izveidošana.......................................................................................27
5.1. Strukturētā veidā.............................................................................................................27
5.2. Nestrukturētā veidā.........................................................................................................27
5.3. Binārā veidā....................................................................................................................27
6. Datu ievade izveidotajās tabulās............................................................................................28
7. Vaicājumu definēšana un izpildīšana....................................................................................30
7.1. Xquery vaicājumi............................................................................................................30
7.2. PL/SQL vaicājumi..........................................................................................................31
7.3. SQL vaicājumi................................................................................................................31
8. XML datu izvadīšana relāciju datu veidā..............................................................................32
9. Relāciju datu izvadīšana XML datu veidā.............................................................................36
Secinājumi.....................................................................................................................................38
UZDEVUMA NOSTĀDNE
XML datu bāzes izveidošana un izmantošana
1. XMLType tipa tabulas bez shēmas izmantošanas izveidošana .
2. Datu ievade izveidotajā tabulā.
3. Vaicājumu definēšana un izpildīšana (XQuery, PL/SQL, SQL vaicājumi).
4. XML dokumentu shēmas izveidošana un reģistrēšana datu bāzē.
5. XMLType tipa tabulas izveidošana:
- strukturētā veidā;
- nestrukturētā veidā;
- binārā veidā (Oracle11g).
6. Datu ievade izveidotajās tabulās.
7. Vaicājumu definēšana un izpildīšana (XQuery, PL/SQL, SQL vaicājumi).
8. XML datu izvadīšana relāciju datu veidā.
9. Relāciju datu izvadīšana XML datu veidā.
10. Secinājumi
1. XMLTYPE TIPA TABULAS BEZ SHĒMAS IZMANTOŠANAS
IZVEIDOŠANA
Lai darba izpildē nebūtu problēmu ar to, ka Oracle versija ir novecojusi priekš dotā
uzdevuma izpildes (paragrāfs 5.3), uzreiz, uzsākot darbu, tika uzinstalēta jaunākā Oracle 11g
release 2 DBVS versija. Tās lietojumu ekspresi var apskatīties attēlā 1.1.
1.1. att. ORACLE Application Express darbība
Tagad var ķerties pie uzdevuma izpildes.
Sākumā izveidosim divas tabulas, kas saturēs vienu kolonu XMLTYPE tipa, lai glabātu
XML datus. Vienas tabulas nosaukums būs STUDENTI_SEKMES, kas glabās informāciju par
studentu sekmēm mācību procesā (atzīmes studētos priekšmetos), bet otras tabulas nosaukums
būs STUDENTI_INFO, kas saturēs informāciju par studentu personīgo informāciju.
Tam nolūkam izmantosim sekojošos divus vaicājumus:CREATE TABLE STUDENTI_SEKMES (
ID NUMBER(10) NOT NULL PRIMARY KEY,VARDS VARCHAR2(50) NOT NULL,UZVARDS VARCHAR2(50) NOT NULL,XML_DATA XMLTYPE NOT NULL
);
CREATE TABLE STUDENTI_INFO (ID NUMBER(10) NOT NULL PRIMARY KEY,STUDENTA_ID NUMBER (10) NOT NULL,XML_DATA XMLTYPE NOT NULL,
CONSTRAINT STUDENTA_IDENTIFIKATORS FOREIGN KEY(STUDENTA_ID) REFERENCES STUDENTI_SEKMES(ID) ON DELETE CASCADE);
Tabula STUDENT_INFO atsaucas uz pirmās tablas identifikatoru pēc sekundārās
atslēgas, lai nedublētos informācija (studenta vārds un uzvārds).
2. DATU IEVADE IZVEIDOTAJĀ TABULĀ
Lai ievadītu datus mūsu izveidotajā tabulā, vispirms ir jāizveido XML faili ar
informāciju, kuru glabāsim tabulu kolonās, kuru tips ir XMLTYPE.
Šim nolūkam bija uzinstalēts jaudīgs XML failu redaktors Altova XML Spy. Tā darbību
var aplūkot attēlā 2.1.
2.1. att. Altova XML Spy redaktors
Vispirms izveidosim XML failus, kas saturēs informāciju par studentu sekmēm katram
studentam atsevišķi.
Pirmam studentam:<?xml version="1.0" encoding="UTF-8"?><pusgadi>
<pusgads id="1"><matematika>10</matematika><fizika>8</fizika><datu_bazes>9</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="2">
<matematika>6</matematika><fizika>5</fizika><datu_bazes>4</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="3">
<matematika>7</matematika><fizika>5</fizika><datu_bazes>4</datu_bazes><kimija>3</kimija>
</pusgads><pusgads id="4">
<matematika>3</matematika><fizika>2</fizika>
<datu_bazes>3</datu_bazes><kimija>3</kimija>
</pusgads></pusgadi>
Otram studentam:<?xml version="1.0" encoding="UTF-8"?><pusgadi>
<pusgads id="1"><matematika>5</matematika><fizika>6</fizika><datu_bazes>7</datu_bazes><kimija>3</kimija>
</pusgads><pusgads id="2">
<matematika>7</matematika><fizika>9</fizika><datu_bazes>3</datu_bazes><kimija>6</kimija>
</pusgads><pusgads id="3">
<matematika>6</matematika><fizika>5</fizika><datu_bazes>3</datu_bazes><kimija>10</kimija>
</pusgads><pusgads id="4">
<matematika>8</matematika><fizika>9</fizika><datu_bazes>10</datu_bazes><kimija>7</kimija>
</pusgads></pusgadi>
Trešam studentam:<?xml version="1.0" encoding="UTF-8"?><pusgadi>
<pusgads id="1"><matematika>3</matematika><fizika>4</fizika><datu_bazes>5</datu_bazes><kimija>6</kimija>
</pusgads><pusgads id="2">
<matematika>7</matematika><fizika>7</fizika><datu_bazes>8</datu_bazes><kimija>9</kimija>
</pusgads><pusgads id="3">
<matematika>9</matematika><fizika>9</fizika><datu_bazes>9</datu_bazes><kimija>9</kimija>
</pusgads><pusgads id="4">
<matematika>10</matematika><fizika>10</fizika><datu_bazes>10</datu_bazes><kimija>10</kimija>
</pusgads></pusgadi>
Ceturtam studentam:<?xml version="1.0" encoding="UTF-8"?><pusgadi>
<pusgads id="1"><matematika>2</matematika><fizika>3</fizika><datu_bazes>4</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="2">
<matematika>9</matematika><fizika>8</fizika><datu_bazes>7</datu_bazes><kimija>6</kimija>
</pusgads><pusgads id="3">
<matematika>6</matematika><fizika>5</fizika><datu_bazes>5</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="4">
<matematika>7</matematika><fizika>8</fizika><datu_bazes>7</datu_bazes><kimija>8</kimija>
</pusgads></pusgadi>
Tagad izveidosim XML failus ar personīgo informāciju par katru studentu atsevišķi.
Pirmam studentam:<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Daugavpils</pilseta><iela>2 Precu iela</iela><majas_nr>1</majas_nr><dzivokla_nr>2</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>28351324</telefons><telefons>29807045</telefons>
</telefoni></informacija>
Otram studentam:<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Rīga</pilseta><iela>Brīvības iela</iela><majas_nr>3</majas_nr><dzivokla_nr>4</dzivokla_nr>
</adrese><adrese>
<pilseta>Ludza</pilseta><iela>Rīgas iela</iela>
<majas_nr>5</majas_nr><dzivokla_nr>8</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>25555555</telefons><telefons>29999999</telefons>
</telefoni></informacija>
Trešam studentam:<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Preiļi</pilseta><iela>Kurzemes iela</iela><majas_nr>8</majas_nr><dzivokla_nr>8</dzivokla_nr>
</adrese><adrese>
<pilseta>Rīga</pilseta><iela>Daugavpils iela</iela><majas_nr>90</majas_nr><dzivokla_nr>1</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>21234569</telefons><telefons>29876543</telefons><telefons>28529637</telefons>
</telefoni></informacija>
Ceturtam studentam:<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Liepāja</pilseta><iela>Alotnes iela</iela><majas_nr>99</majas_nr><dzivokla_nr>15</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>25519634</telefons><telefons>28496378</telefons><telefons>25195637</telefons><telefons>28484896</telefons>
</telefoni></informacija>
XML faili ir gatavi ielādei. Lai tos veiksmīgi ielādēt, vispirms izveidosim direktoriju datubāzē, kura
saturēs informāciju par to, kur glabājas mūsu izveidotie XML faili. Šim nolūkam izpildīsim sekojošo
vaicājumu:
CREATE OR REPLACE DIRECTORY XMLDIR AS 'd:/xml_db';Ievadīsim datus tabulē STUDENTI_SEKMES ar sekojošo vaicājumu palīdzību:
INSERT INTO STUDENTI_SEKMES (ID, VARDS, UZVARDS, XML_DATA) VALUES (1,'Arturs','Feoklistovs',XMLType(bfilename('XMLDIR', '1_sekmes.xml'), nls_charset_id('AL32UTF8')));
INSERT INTO STUDENTI_SEKMES (ID, VARDS, UZVARDS, XML_DATA) VALUES (2,'Sergejs','Isajevs',XMLType(bfilename('XMLDIR', '2_sekmes.xml'), nls_charset_id('AL32UTF8')));
INSERT INTO STUDENTI_SEKMES (ID, VARDS, UZVARDS, XML_DATA) VALUES (3,'Aleksis','Jakovlevs',XMLType(bfilename('XMLDIR', '3_sekmes.xml'), nls_charset_id('AL32UTF8')));
INSERT INTO STUDENTI_SEKMES (ID, VARDS, UZVARDS, XML_DATA) VALUES (4,'Ksenija','Talerko',XMLType(bfilename('XMLDIR', '4_sekmes.xml'), nls_charset_id('AL32UTF8')));
Dati pirmajās trijās kolonās tiek ievietoti vienkārši, bet pēdējā kolonā dati tiek ievadīti ar
tipa XMLType konstruktora funkcijas palīdzību, kurai ir nepiciešams norādīt 2 parametrus – ceļš
pie faila un kodējuma variantu.
Pārbaudīsim, vai dati ir ievietoti korekti ar sekojošo vaicājumu:SELECT * FROM STUDENTI_SEKMES;
Attēlā 2.2 ir parādīts dotā vaicājuma rezultāts. Ir redzams, ka viss ir kārtībā.
2.2. att. Ievadītie dati pirmajā tabulā
Datus tabulā STUDENTI_INFO ievadīsim nedaudz citā veidā. Vaicājumā neizmantosim
XML failu, bet XML tekstu ievietosim tieši vaicājuma ķermenī.INSERT INTO STUDENTI_INFO (ID, STUDENTA_ID, XML_DATA) VALUES (1,1,XMLTYPE('<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Daugavpils</pilseta><iela>2 Precu iela</iela><majas_nr>1</majas_nr><dzivokla_nr>2</dzivokla_nr>
</adrese></adreses>
<telefoni><telefons>28351324</telefons><telefons>29807045</telefons>
</telefoni></informacija>'));
INSERT INTO STUDENTI_INFO (ID, STUDENTA_ID, XML_DATA) VALUES (2,2,XMLTYPE('<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Rīga</pilseta><iela>Brīvības iela</iela><majas_nr>3</majas_nr><dzivokla_nr>4</dzivokla_nr>
</adrese><adrese>
<pilseta>Ludza</pilseta><iela>Rīgas iela</iela><majas_nr>5</majas_nr><dzivokla_nr>8</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>25555555</telefons><telefons>29999999</telefons>
</telefoni></informacija>'));
INSERT INTO STUDENTI_INFO (ID, STUDENTA_ID, XML_DATA) VALUES (3,3,XMLTYPE('<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Preiļi</pilseta><iela>Kurzemes iela</iela><majas_nr>8</majas_nr><dzivokla_nr>8</dzivokla_nr>
</adrese><adrese>
<pilseta>Rīga</pilseta><iela>Daugavpils iela</iela><majas_nr>90</majas_nr><dzivokla_nr>1</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>21234569</telefons><telefons>29876543</telefons><telefons>28529637</telefons>
</telefoni></informacija>'));
INSERT INTO STUDENTI_INFO (ID, STUDENTA_ID, XML_DATA) VALUES (
4,4,XMLTYPE('<?xml version="1.0" encoding="UTF-8"?><informacija>
<adreses><adrese>
<pilseta>Liepāja</pilseta><iela>Alotnes iela</iela><majas_nr>99</majas_nr><dzivokla_nr>15</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>25519634</telefons><telefons>28496378</telefons><telefons>25195637</telefons><telefons>28484896</telefons>
</telefoni></informacija>'));
Pārbaudīsim, vai dati ir ievietoti korekti ar sekojošo vaicājumu:SELECT * FROM STUDENTI_INFO;
Attēlā 2.3. ir parādīts dotā vaicājuma rezultāts. Ir redzams, ka viss ir kārtībā.
2.3. att. Ievadītie dati otrajā tabulā
3. VAICĀJUMU DEFINĒŠANA UN IZPILDĪŠANA
Dotajā nodaļā izpildīsim Xquery, PL/SQL un SQL vaicājumus.
3.1. Xquery vaicājumi
Izmantosim SQL/XML standartfunkciju XMLQuery, lai izgūtu datus no XMLType tipa
kolonnas, lietojot vaicājumu valodu – Xquery.
Izveidosim vaicājumu, kas izvadīs studentu vidējo atzīmi katrā pusgadā un pusgada
numuru, ja studentam nav parādu tekošā pusgadā (visas atzīmes ir > 3), kā arī izvadīsim studentu
telefonu numurus, kuri beidzas ar ciparu 4.Select A.Id, A.Vards, A.Uzvards, B.Xml_Data.Extract('/informacija/adreses/adrese[1]/pilseta/text()').Getstringval() As Pilseta,Xmlquery ('for $x in /informacija/telefoni/telefonswhere ends-with($x , "4")return data($x)'passing B.XML_DATA RETURNING CONTENT) Telefons,Xmlquery ('for $x in /pusgadi/pusgadswhere $x[fizika>3] and $x[kimija>3] and $x[datu_bazes]>3 and $x[matematika]>3return (data(round((avg($x)))), data($x/@id))'passing A.XML_DATA RETURNING CONTENT) Vid_atzimeFROM STUDENTI_SEKMES A INNER JOIN STUDENTI_INFO B ON A.ID = B.STUDENTA_ID;
Vaicājuma rezultātu var apskatīt attēlā 3.1.
3.1. att. Vaicājuma izpildes rezultāts
Izvadīsim visas pilnas adreses no studentu personīgās informācijas.Select A.Id, A.Vards, A.Uzvards, Xmlquery ('for $a in /informacija/adreses/adreseorder by $a//pilsetareturn ("- Pilseta: ", data($a/pilseta),"; Iela: ", data($a/iela),"; Majas numurs: ", data($a/majas_nr),"; Dzivokla numurs: ", data($a/dzivokla_nr))'passing B.XML_DATA RETURNING CONTENT) Pilna_adreseFROM STUDENTI_SEKMES A INNER JOIN STUDENTI_INFO B ON A.ID = B.STUDENTA_ID;
Vaicājuma rezultāts ir attēlots attēlā 3.2.
3.2. att. Vaicājuma izpildes rezultāts
3.2. PL/SQL vaicājumi
Izveidosim anonīmo bloku, kas izvadīs studentu vidējo atzīmi pirmajā pusgadā, ja
studentam nav parādu nevienā priekšmetā (visas atzīmes ir > 3).DECLARE
A_XML_DATA XMLTYPE;A_ID NUMBER(10);A_VARDS VARCHAR2(50);A_UZVARDS VARCHAR2(50);FIZIKA NUMBER;MATEMATIKA NUMBER;KIMIJA NUMBER;DATU_BAZES NUMBER;VID NUMBER (5,2);
CURSOR STUD_KURSORS ISSelect A.Id, A.VARDS, A.UZVARDS, A.XML_DATAFROM STUDENTI_SEKMES AWhereExistsnode (A.Xml_Data, '/pusgadi/pusgads[@id="1"][fizika<4]')=0 andEXISTSNODE (A.XML_DATA, '/pusgadi/pusgads[@id="1"][matematika<4]')=0 andExistsnode (A.Xml_Data, '/pusgadi/pusgads[@id="1"][kinija<4]')=0 AndEXISTSNODE (A.XML_DATA, '/pusgadi/pusgads[@id="1"][datu_bazes<4]')=0;
BEGINOPEN STUD_KURSORS;LOOP
FETCH STUD_KURSORS INTO A_ID, A_VARDS, A_UZVARDS, A_XML_DATA;EXIT WHEN STUD_KURSORS%NOTFOUND;KIMIJA :=
A_XML_DATA.extract('/pusgadi/pusgads[@id="1"]/kimija/text()').getnumberval();FIZIKA :=
A_XML_DATA.extract('/pusgadi/pusgads[@id="1"]/fizika/text()').getnumberval();DATU_BAZES :=
A_XML_DATA.extract('/pusgadi/pusgads[@id="1"]/datu_bazes/text()').getnumberval();MATEMATIKA :=
A_XML_DATA.extract('/pusgadi/pusgads[@id="1"]/matematika/text()').getnumberval();VID := (KIMIJA + FIZIKA + DATU_BAZES + MATEMATIKA) / 4;DBMS_OUTPUT.PUT_LINE ('Vards: ' ||A_VARDS);DBMS_OUTPUT.PUT_LINE ('Uzvards: ' ||A_UZVARDS);DBMS_OUTPUT.PUT_LINE ('Videja atzime: ' ||VID);
END LOOP;CLOSE STUD_KURSORS;
END;Pašā sākumā tiek definēti mainīgie, kuri būs mums nepieciešami aprēķinu gaitā. Vēlāk
tiek izveidots kursors, kas saturēs datus par tādiem studentiem, kuriem nav parādu nevienā
priekšmetā pirmajā pusgadā (tas tiek realizēts ar funkcijas ExistsNode() palīdzību, ja funkcija
atgriezīs 0, tad studentam nav atzīmju, kas ir < 4 (Funkcija pārbauda vai eksistē meklējamais
mezgls, ja eksistē – atgriež true rezultātu, pretējā gadījumā – false.)). Ar funkcijas extract()
palīdzību XML dokumenta daļas tiek izgūtas mainīgajos, no kuriem vēlāk tiek veikts vidējās
vērtības aprēķins un tiek izvadīti ar DBMS_OUTPUT komandas palīdzību. Anonīma bloka
darbības rezultāts ir paradīts 3.3. attēlā. Kā redzams, ir 2 sekmīgie studenti – Arturs Feoklistovs
un Sergejs Isajevs, kuru vidējās atzīmes priekšmetos ir 8 un 5.25 attiecīgi.
3.3. att. Anonīmā bloka izpildes rezultāts
3.3. SQL vaicājumi
Izpildīsim 2 SQL vaicājumus:
1. vaicājums būs diezgan vienkāršs, tas atgriezīs mums XML_DATA kolonnas saturu ar
funkcijas getCLOBVal() palīdzību. Tas būs visa informācija XML teksta veidā par studenta
personīgo informāciju, kura ID=1. Vaicājumu un tā rezultātu var apskatīt attēlā 3.4.
3.4. att. Ievadītie dati otrajā tabulā
2. vaicājums izmantos funkciju extractValue(), kas dod iespēju pieejai pie XML
konkrētiem datiem, izmantojot valodu XPath. Izveidosim vaicājumu, kas izvadīs studentu vārdus
un uzvārdus, kā arī to atzīmes visos priekšmetos, kuriem ir parādi (atzīme par priekšmetu ir <4)
par 1. pusgadu jebkādā no 4 priekšmetiem.SELECT A.ID, A.VARDS, A.UZVARDS,A.XML_DATA.EXTRACT('/pusgadi/pusgads[@id="1"]/kimija/text()').getnumberval() AS KIMIJA,A.XML_DATA.EXTRACT('/pusgadi/pusgads[@id="1"]/matematika/text()').getnumberval() AS MATEMATIKA,A.XML_DATA.EXTRACT('/pusgadi/pusgads[@id="1"]/fizika/text()').getnumberval() AS FIZIKA,A.XML_DATA.EXTRACT('/pusgadi/pusgads[@id="1"]/datu_bazes/text()').getnumberval() AS DATU_BAZESFROM STUDENTI_SEKMES A WHEREEXTRACTVALUE (A.XML_DATA, '/pusgadi/pusgads[@id="1"]/matematika/text()') < 4 orEXTRACTVALUE (A.XML_DATA, '/pusgadi/pusgads[@id="1"]/fizika/text()') < 4 orEXTRACTVALUE (A.XML_DATA, '/pusgadi/pusgads[@id="1"]/kimija/text()') < 4 orEXTRACTVALUE (A.XML_DATA, '/pusgadi/pusgads[@id="1"]/datu_bazes/text()') < 4;
Attēlā 3.5 ir parādīts dotā vaicājuma rezultāts.
3.5. att. Nesekmīgie studenti par 1. pusgadu
4. XML DOKUMENTU SHĒMAS IZVEIDOŠANA UN
REĢISTRĒŠANA DATU BĀZĒ
4.1. XML shēmas veidošana glabāšanai tabulā strukturētā veidā
Lai izveidotu XML dokumenta shēmu, vispirms modificēsim mūsu divus XML failu
tipus, apvienojot tos kopā vienā failā, kurā glabāsies kā informācija par studentu sekmēm, tā arī
informācija par studentu personīgo info. Tas būs pirmais XML fails, ko mēs izmantosim
glabāšanai datu bāzē strukturētā veidā.
Mēs iegūstam sekojošo XML failu:<?xml version="1.0" encoding="UTF-8"?><studenti">
<students uzvards="Feoklistovs"><informacija>
<adreses><adrese>
<pilseta>Daugavpils</pilseta><iela>2 Precu iela</iela><majas_nr>1</majas_nr><dzivokla_nr>2</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>28351324</telefons><telefons>29807045</telefons>
</telefoni></informacija><sekmes>
<pusgads id="1"><matematika>10</matematika><fizika>8</fizika><datu_bazes>9</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="2">
<matematika>6</matematika><fizika>5</fizika><datu_bazes>4</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="3">
<matematika>7</matematika><fizika>5</fizika><datu_bazes>4</datu_bazes><kimija>3</kimija>
</pusgads><pusgads id="4">
<matematika>3</matematika><fizika>2</fizika><datu_bazes>3</datu_bazes><kimija>3</kimija>
</pusgads></sekmes>
</students>
<students uzvards="Isajevs"><informacija>
<adreses><adrese>
<pilseta>Rīga</pilseta><iela>Brīvības iela</iela><majas_nr>3</majas_nr><dzivokla_nr>4</dzivokla_nr>
</adrese><adrese>
<pilseta>Ludza</pilseta><iela>Rīgas iela</iela><majas_nr>5</majas_nr><dzivokla_nr>8</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>25555555</telefons><telefons>29999999</telefons>
</telefoni></informacija><sekmes>
<pusgads id="1"><matematika>5</matematika><fizika>6</fizika><datu_bazes>7</datu_bazes><kimija>3</kimija>
</pusgads><pusgads id="2">
<matematika>7</matematika><fizika>9</fizika><datu_bazes>3</datu_bazes><kimija>6</kimija>
</pusgads><pusgads id="3">
<matematika>6</matematika><fizika>5</fizika><datu_bazes>3</datu_bazes><kimija>10</kimija>
</pusgads><pusgads id="4">
<matematika>8</matematika><fizika>9</fizika><datu_bazes>10</datu_bazes><kimija>7</kimija>
</pusgads></sekmes>
</students><students uzvards="Jakovlevs">
<informacija><adreses>
<adrese><pilseta>Preiļi</pilseta><iela>Kurzemes iela</iela><majas_nr>8</majas_nr><dzivokla_nr>8</dzivokla_nr>
</adrese><adrese>
<pilseta>Rīga</pilseta><iela>Daugavpils iela</iela><majas_nr>90</majas_nr><dzivokla_nr>1</dzivokla_nr>
</adrese>
</adreses><telefoni>
<telefons>21234569</telefons><telefons>29876543</telefons><telefons>28529637</telefons>
</telefoni></informacija><sekmes>
<pusgads id="1"><matematika>3</matematika><fizika>4</fizika><datu_bazes>5</datu_bazes><kimija>6</kimija>
</pusgads><pusgads id="2">
<matematika>7</matematika><fizika>7</fizika><datu_bazes>8</datu_bazes><kimija>9</kimija>
</pusgads><pusgads id="3">
<matematika>9</matematika><fizika>9</fizika><datu_bazes>9</datu_bazes><kimija>9</kimija>
</pusgads><pusgads id="4">
<matematika>10</matematika><fizika>10</fizika><datu_bazes>10</datu_bazes><kimija>10</kimija>
</pusgads></sekmes>
</students><students uzvards="Talerko">
<informacija><adreses>
<adrese><pilseta>Liepāja</pilseta><iela>Alotnes iela</iela><majas_nr>99</majas_nr><dzivokla_nr>15</dzivokla_nr>
</adrese></adreses><telefoni>
<telefons>25519634</telefons><telefons>28496378</telefons><telefons>25195637</telefons><telefons>28484896</telefons>
</telefoni></informacija><sekmes>
<pusgads id="1"><matematika>2</matematika><fizika>3</fizika><datu_bazes>4</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="2">
<matematika>9</matematika><fizika>8</fizika><datu_bazes>7</datu_bazes><kimija>6</kimija>
</pusgads><pusgads id="3">
<matematika>6</matematika><fizika>5</fizika><datu_bazes>5</datu_bazes><kimija>5</kimija>
</pusgads><pusgads id="4">
<matematika>7</matematika><fizika>8</fizika><datu_bazes>7</datu_bazes><kimija>8</kimija>
</pusgads></sekmes>
</students></studenti>
Izmantojot rīka Altova XML Spy iespējas, noģenerēsim attiecīgu dokumenta shēmu.
Uzstādot ģenerēšanas parametrus, izslēgsim enumerations ierobežojumu ieviešanu, lai varētu
nākotnē pievienot datus ar jaunām vērtībām, nevis tikai ar tādām, kuras jau ir definētas. Mēs
ieguvām sekojošā veida shēmu:
4.1. att. Shēmas grafiks
Shēmas teksts ir sekojošs:<?xml version="1.0" encoding="UTF-8"?><!--W3C Schema generated by XMLSpy v2011 rel. 2 (http://www.altova.com)--><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="studenti"><xs:complexType>
<xs:sequence><xs:element name="students" maxOccurs="unbounded">
<xs:complexType><xs:sequence>
<xs:element name="informacija"><xs:complexType>
<xs:sequence><xs:element
name="adreses">
<xs:complexType>
<xs:sequence>
<xs:element name="adrese" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="pilseta" type="xs:string"/>
<xs:element name="iela" type="xs:string"/>
<xs:element name="majas_nr" type="xs:byte"/>
<xs:element name="dzivokla_nr" type="xs:byte"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType></xs:element><xs:element
name="telefoni">
<xs:complexType>
<xs:sequence>
<xs:element name="telefons" type="xs:int" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType></xs:element>
</xs:sequence></xs:complexType>
</xs:element><xs:element name="sekmes">
<xs:complexType><xs:sequence>
<xs:element name="pusgads" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="matematika" type="xs:byte"/>
<xs:element name="fizika" type="xs:byte"/>
<xs:element name="datu_bazes" type="xs:byte"/>
<xs:element name="kimija" type="xs:byte"/>
</xs:sequence>
<xs:attribute name="id" type="xs:byte" use="required"/>
</xs:complexType></xs:element>
</xs:sequence></xs:complexType>
</xs:element></xs:sequence><xs:attribute name="uzvards" type="xs:string"
use="required"/></xs:complexType>
</xs:element></xs:sequence>
</xs:complexType></xs:element>
</xs:schema>
Lai doto shēmu reģistrēt datu bāzē, izmantosim sekojošo vaicājumu:BEGIN
DBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL => 'http://localhost:8080/public/schema1.xsd',SCHEMADOC => bfilename ('XMLDIR', 'schema.xsd'),CSID => nls_charset_id ('AL32UTF8'));
END;Lai pārliecinātos, ka shēma tika piereģistrēta datubāzē, izveidosim vaicājumu, kas
atgriezīs datus no user_xml_schemas.SELECT SCHEMA_URL FROM USER_XML_SCHEMAS;
Veiksmīgā vaicājuma rezultātu var apskatīties attēlā 4.2.
4.2. att. Shēmas URL adrese datu bāzē
4.2. XML shēmas veidošana glabāšanai tabulā nestrukturētā veidā
Ar Altova rīka palīdzību izveidosim 3 XML failus, kas mums būs vajadzīgi glabāšanai
tabulā nestrukturētā veidā. Faili glabās informāciju par cilvēku maksājumiem mēnešos.
Mēs izveidojām sekojošos 3 failus:<?xml version="1.0" encoding="UTF-8"?><maksajumi>
<maksajums periods="2011-1"><internets>13.50</internets><telefons>20.40</telefons><apkure>30.00</apkure>
</maksajums><maksajums periods="2011-2">
<internets>13.50</internets><telefons>14.40</telefons><apkure>31.00</apkure>
</maksajums><maksajums periods="2011-3">
<internets>13.50</internets><telefons>10.40</telefons><apkure>32.00</apkure>
</maksajums></maksajumi>
<?xml version="1.0" encoding="UTF-8"?><maksajumi>
<maksajums periods="2011-1"><internets>12.50</internets><telefons>11.40</telefons><apkure>25.00</apkure>
</maksajums><maksajums periods="2011-2">
<internets>12.50</internets><telefons>9.42</telefons><apkure>25.00</apkure>
</maksajums><maksajums periods="2011-3">
<internets>12.50</internets><telefons>3.30</telefons><apkure>25.00</apkure>
</maksajums></maksajumi>
<?xml version="1.0" encoding="UTF-8"?><maksajumi>
<maksajums periods="2011-1"><internets>11.30</internets><internets-atlaide>2.00</internets-atlaide><telefons>20.40</telefons><apkure>30.00</apkure>
</maksajums><maksajums periods="2011-2">
<internets>11.30</internets><telefons>14.40</telefons><telefons-atlaide>4.00</telefons-atlaide><apkure>35.00</apkure>
</maksajums><maksajums periods="2011-3">
<internets>11.30</internets><internets-atlaide>2.00</internets-atlaide><telefons>10.40</telefons><telefons-atlaide>1</telefons-atlaide><apkure>32.00</apkure>
</maksajums></maksajumi>
Kā redzams pēdējais maksājumu fails satur iezīmes ar atlaidēm par pakalpojumiem, šajā
gadījumā mazliet modificēsim ar Altova rīka palīdzību izveidoto shēmu, pievienojot, ka dotā
iezīme XML failā nav obligāta, iezīmi minOccurs="0".
Mēs ieguvām sekojošo shēmu:<?xml version="1.0" encoding="UTF-8"?><!--W3C Schema generated by XMLSpy v2011 rel. 2 (http://www.altova.com)--><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="maksajumi"><xs:complexType>
<xs:sequence><xs:element name="maksajums" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence><xs:element name="internets"
type="xs:decimal"/><xs:element name="internets-atlaide"
type="xs:decimal" minOccurs="0"/><xs:element name="telefons"
type="xs:decimal"/><xs:element name="telefons-atlaide"
type="xs:decimal" minOccurs="0"/><xs:element name="apkure" type="xs:decimal"/><xs:element name="apkure-atlaide"
minOccurs="0"><xs:complexType/>
</xs:element></xs:sequence><xs:attribute name="periods" type="xs:string"
use="required"/></xs:complexType>
</xs:element></xs:sequence>
</xs:complexType></xs:element>
</xs:schema>Shēmas attēlojumu diagrammas veidā var aplūkot attēlā 4.3.
4.3. att. Shēmas diagramma
Lai doto shēmu reģistrēt datu bāzē, izmantosim sekojošo vaicājumu:BEGIN
DBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL => 'http://localhost:8080/public/max.xsd',SCHEMADOC => bfilename ('XMLDIR', 'max.xsd'),CSID => nls_charset_id ('AL32UTF8'));
END;Lai pārliecinātos, ka shēma tika piereģistrēta datubāzē, izveidosim vaicājumu, kas
atgriezīs datus no user_xml_schemas.SELECT SCHEMA_URL FROM USER_XML_SCHEMAS;
Veiksmīgā vaicājuma rezultātu var apskatīties attēlā 4.4.
4.4. att. Shēmas URL adrese datu bāzē
4.3. XML shēmas veidošana glabāšanai tabulā binārā veidā
Ar Altova rīka palīdzību izveidosim 3 XML failus, kas mums būs vajadzīgi glabāšanai
tabulā binārā veidā. Faili glabās informāciju par grāmatām grāmatu veikalā, to cenu, autoru un
izlaides gadu.
Mēs izveidojām sekojošos 3 failus:<?xml version="1.0" encoding="UTF-8"?><gramatas>
<gramata id="1"><cena>10.00</cena><autors>Berzins</autors><gads>2010</gads>
</gramata><gramata id="2">
<cena>15.00</cena><autors>Skribusts</autors><gads>2009</gads>
</gramata><gramata id="3">
<cena>5.00</cena><autors>Liepa</autors><gads>2008</gads>
</gramata></gramatas>
<?xml version="1.0" encoding="UTF-8"?><gramatas>
<gramata id="1"><cena>7.00</cena><autors>Upitis</autors><gads>2001</gads>
</gramata><gramata id="2">
<cena>18.00</cena><autors>Lielvestis</autors><gads>2002</gads>
</gramata><gramata id="3">
<cena>12.50</cena><autors>Lukjanenko</autors><gads>1999</gads>
</gramata></gramatas>
<?xml version="1.0" encoding="UTF-8"?><gramatas>
<gramata id="1"><cena>2.00</cena><autors>Kauja</autors><gads>2002</gads>
</gramata><gramata id="2">
<cena>4.20</cena><autors>Sniegavirs</autors><gads>2002</gads>
</gramata><gramata id="3">
<cena>12.50</cena><autors>Rainis</autors><gads>2005</gads>
</gramata></gramatas>
Ar Altova rīka palīdzību mēs ieguvām sekojošo shēmu:<?xml version="1.0" encoding="UTF-8"?><!--W3C Schema generated by XMLSpy v2011 rel. 2 (http://www.altova.com)--><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="gramatas"><xs:complexType>
<xs:sequence><xs:element name="gramata" maxOccurs="unbounded">
<xs:complexType><xs:sequence>
<xs:element name="cena" type="xs:decimal"/><xs:element name="autors" type="xs:string"/><xs:element name="gads" type="xs:short"/>
</xs:sequence><xs:attribute name="id" type="xs:byte" use="required"/>
</xs:complexType></xs:element>
</xs:sequence></xs:complexType>
</xs:element></xs:schema>
Shēmas attēlojumu diagrammas veidā var aplūkot attēlā 4.5.
4.5. att. Shēmas diagramma
Lai doto shēmu reģistrēt datu bāzē, izmantosim sekojošo vaicājumu:BEGIN
DBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL => 'http://localhost:8080/public/gr.xsd',SCHEMADOC => bfilename ('XMLDIR', 'gr.xsd'),CSID => nls_charset_id ('AL32UTF8'),GENTYPES => FALSE,OPTIONS => REGISTER_BINARYXML);
END;Lai shēmu reģistrēt binārai XML datu glabāšanai, ir nepieciešams uzstādīt OPTIONS
parametru – REGISTER_BINARYXML.
Lai pārliecinātos, ka shēma tika piereģistrēta datubāzē, izveidosim vaicājumu, kas
atgriezīs datus no user_xml_schemas.SELECT SCHEMA_URL FROM USER_XML_SCHEMAS;
Veiksmīgā vaicājuma rezultātu var apskatīties attēlā 4.6.
4.4. att. Shēmas URL adrese datu bāzē
5. XMLTYPE TIPA TABULAS IZVEIDOŠANA
Visas shēmas ir reģistrētasa datu bāzē, var ķerties pie attiecīgu tabulu izveidošanas.
5.1. Strukturētā veidā
Lai izveidotu tabulu, izveidosim sekojošo vaicājumu.CREATE TABLE STUDENTI OF XMLTYPEXMLSCHEMA "http://localhost:8080/public/schema1.xsd"ELEMENT "studenti";
Tabulas veidošanas procesā ir jānorāda URL uz reģistrēto shēmu, kā arī jānorāda
galvenais (global) elements.
5.2. Nestrukturētā veidā
Lai izveidotu tabulu, izveidosim sekojošo vaicājumu.CREATE TABLE MAKSAJUMI (
ID NUMBER(10) NOT NULL PRIMARY KEY,UZVARDS VARCHAR2(50) NOT NULL,XML_DATA XMLTYPE NOT NULL
) XMLType COLUMN XML_DATA STORE AS CLOB XMLSCHEMA "http://localhost:8080/public/max.xsd"ELEMENT "maksajumi";
Tabulas veidošanas procesā ir jānorāda URL uz reģistrēto shēmu, kā arī jānorāda
galvenais (global) elements. Būtiska atšķirība veidojot glabāšanu nestrukturētā veidā, ir jānorāda
parametru STORE AS CLOB.
5.3. Binārā veidā
Lai izveidotu tabulu, izveidosim sekojošo vaicājumu.CREATE TABLE VEIKALI (
ID NUMBER(10) NOT NULL PRIMARY KEY,NOSAUKUMS VARCHAR2(50) NOT NULL,XML_DATA XMLTYPE NOT NULL
) XMLType COLUMN XML_DATA STORE AS BINARY XML XMLSCHEMA "http://localhost:8080/public/gr.xsd"ELEMENT "gramatas";
Tabulas veidošanas procesā ir jānorāda URL uz reģistrēto shēmu, kā arī jānorāda
galvenais (global) elements. Būtiska atšķirība veidojot glabāšanu binārā veidā, ir jānorāda
parametru STORE AS BINARY XML.
6. DATU IEVADE IZVEIDOTAJĀS TABULĀS
Ievadīsim datus tabulā STUDENTI ar sekojošā vaicājuma palīdzību.INSERT INTO STUDENTI VALUES (XMLType(bfilename('XMLDIR', 'mixed.xml'), nls_charset_id('AL32UTF8')));
Pārbaudīsim datu ievadi ar sekojošo vaicājumu, kā redzams attēlā 6.1, viss ir ievadīts
veiksmīgi.
6.1. att. Ievadītie dati tabulā STUDENTI
Ievadīsim datus tabulā MAKSAJUMI ar sekojošu vaicājumu palīdzību.Insert Into Maksajumi Values (1, 'Feoklistovs',XMLType(bfilename('XMLDIR', 'max1.xml'), nls_charset_id('AL32UTF8')));
Insert Into Maksajumi Values (2, 'Isajevs',XMLType(bfilename('XMLDIR', 'max2.xml'), nls_charset_id('AL32UTF8')));
Insert Into Maksajumi Values (3, 'Jakovlevs',XMLType(bfilename('XMLDIR', 'max3.xml'), nls_charset_id('AL32UTF8')));
Pārbaudīsim datu ievadi ar sekojošo vaicājumu, kā redzams attēlā 6.2, viss ir ievadīts
veiksmīgi.
6.2. att. Ievadītie dati tabulā MAKSAJUMI
Ievadīsim datus tabulā VEIKALI ar sekojošu vaicājumu palīdzību.Insert Into Veikali Values (1, 'Zilite',XMLType(bfilename('XMLDIR', 'max1.xml'), nls_charset_id('AL32UTF8')));
Insert Into Veikali Values (2, 'Zilonis',XMLType(bfilename('XMLDIR', 'max2.xml'), nls_charset_id('AL32UTF8')));
Insert Into Veikali Values (3, 'Janis Roze',XMLType(bfilename('XMLDIR', 'max3.xml'), nls_charset_id('AL32UTF8')));
Pārbaudīsim datu ievadi ar sekojošo vaicājumu, kā redzams attēlā 6.3, viss ir ievadīts
veiksmīgi.
6.3. att. Ievadītie dati tabulā VEIKALI
7. VAICĀJUMU DEFINĒŠANA UN IZPILDĪŠANA
7.1. Xquery vaicājumi
Izvadīsim studentu vidējās sekmes no tabulas STUDENTI visos priekšmetos visu
pusgadu laikā, pie tam izvadot datus kā jaunu XML failu.Select Xmlquery (
'<sekmes>{for $x in //studentsreturn <students id="{(data($x/@uzvards))}">{for $y in //studentswhere $y/@uzvards=$x/@uzvardsreturn ( <fizika_vid>{avg($y/sekmes/pusgads/fizika)}</fizika_vid>,<matematika_vid>{avg($y/sekmes/pusgads/matematika)}</matematika_vid>,<kimija_vid>{avg($y/sekmes/pusgads/kimija)}</kimija_vid>,<datu_bazes_vid>{avg($y/sekmes/pusgads/datu_bazes)}</datu_bazes_vid>)}
</students>}</sekmes>'passing OBJECT_VALUE RETURNING CONTENT) SEKMESFROM STUDENTI;Attēlā 7.1 var aplūkot vaicājuma izpildes rezultātu.
7.1. att. Studentu vidējās sekmes visos priekšmetos visu pusgadu laikā
Izveidosim vaicājumu, kas atgriezīs visu grāmatu autorus un izdevniecības gadus no
tabulas VEIKALI, kuru izdevniecības gads ir lielāks par 2002.Select Xmlquery ('for $x in /gramatas/gramatawhere $x[gads>2002]order by (data($x/gads)) ascendingreturndata ($x/gads), data ($x/autors) 'PASSING A.XML_DATA RETURNING CONTENT) XML_DATA FROM VEIKALI A;
7.2. PL/SQL vaicājumi
Izveidosim anonīmo bloku, kas saskaitīs cilvēka ieekonomēto naudu maksājumos, kas
veikti trijos mēnešos par jebkādiem pakalpojumiem.set serveroutput on;Declare Ex1 Number;
Ex2 Number; ex3 number;
A_XML_DATA XMLTYPE;A_Id Number(10);A_UZVARDS VARCHAR2(50);internets NUMBER;Telefons Number;apkure NUMBER;I Number :=0;
atlaides_summa number(5,2) :=0;CURSOR MAKS_KURSORS ISSelect A.Id, A.UZVARDS, A.Xml_DataFROM MAKSAJUMI AWhereExistsnode (A.Xml_Data, '//internets-atlaide')=1 OrExistsnode (A.Xml_Data, '//telefons-atlaide')=1 OrExistsnode (A.Xml_Data, '//apkure-atlaide')=1;
BEGINOPEN MAKS_KURSORS;LOOP
FETCH MAKS_KURSORS INTO A_ID, A_UZVARDS, A_XML_DATA;Exit When Maks_Kursors%Notfound;
LoopI := I + 1;
Internets:=0; Telefons:=0; Apkure:=0; Ex1 :=A_Xml_Data.Existsnode
('/maksajumi/maksajums[@periods="2011-'||I||'"]/internets-atlaide'); IF (Ex1=1) THEN
Internets := A_Xml_Data.Extract('/maksajumi/maksajums[@periods="2011-'||I||'"]/internets-atlaide/text()').Getnumberval();
End If; Ex2 :=A_Xml_Data.Existsnode
('/maksajumi/maksajums[@periods="2011-'||I||'"]/telefons-atlaide'); IF (Ex2=1) THEN
telefons := A_Xml_Data.Extract('/maksajumi/maksajums[@periods="2011-'||I||'"]/telefons-atlaide/text()').Getnumberval();
End If; Ex3 :=A_Xml_Data.Existsnode
('/maksajumi/maksajums[@periods="2011-'||I||'"]/apkure-atlaide'); IF (Ex3=1) THEN
apkure := A_Xml_Data.Extract('/maksajumi/maksajums[@periods="2011-'||I||'"]/apkure-atlaide/text()').Getnumberval();
End If; atlaides_summa:=atlaides_summa+internets+telefons+apkure; IF (i >= 3) THEN
i := 0;EXIT;
END IF;End Loop;Dbms_Output.Put_Line ('UZVARDS: ' ||A_Uzvards);Dbms_Output.Put_Line ('ATLAIDES SUMMA: ' ||Atlaides_Summa);
atlaides_summa:=0;End Loop;CLOSE MAKS_KURSORS;End;Pēc anonīmā bloka izpildes var redzēt, ka atlaides ir saņēmis tikai Jakovlevs un atlaižu
kopējā summa ir 9. To var apskatīties attēlā 7.2.
7.2. att. Cilvēku saņemtās atlaides par 3 mēnešiem
7.3. SQL vaicājumi
Izveidosim vaicājumu, kas no tabulas STUDENTI atgriezīs mums visus telefonus un
studenta uzvārdu pirmā studenta sarakstā.Select Extract (Object_Value,
'//students[1]/informacija/telefoni/telefons').Getstringval() as Telefonu_NR, Extract (Object_Value, '//students[1]/@uzvards').Getstringval() as Uzvards From Studenti;
7.3. att. Studenta uzvārds un tā telefona numuri
Izveidosim vaicājumu, kas atgriež visu cilvēku maksājumus, kas veikti par internetu
pirmajā 2011. gada mēnesī.SELECT extract( A.XML_DATA,
'//maksajums[@periods="2011-1"]/internets').getstringval() maksajums from maksajumi a;
7.4. att. Cilvēku veiktie maksājumi 2011. gada pirmajā mēnesī par internetu
Izveidosim vaicājumu, kas atgriež cilvēka samaksāto summu un atlaidi pirmajā mēnesī
par internetu, ja šajā mēnesī ir bijusi atlaide.SELECT a.uzvards, extract (a.XML_DATA,
'//maksajums[@periods="2011-1"]/internets').getstringval() SAMAKSA, extract ( a.XML_DATA, '//maksajums[@periods="2011-1"]/internets-atlaide').getstringval() atlaide from maksajumi a
Whereexistsnode (a.XML_DATA, '//maksajums[@periods="2011-1"]/internets-atlaide')=1
7.4. att. Cilvēku veiktie maksājumi 2011. gada pirmajā mēnesī ar atlaidi par internetu, ja ir bijusi atlaide
8. XML DATU IZVADĪŠANA RELĀCIJU DATU VEIDĀ
XML datu izvadīšanai relāciju datu veidā izmantosim 2 pieejas.
Pirmā pieeja būs saistīta ar funkcijas EXTRACT darbību. Šim nolūkam uzrakstīsim
nelielu anonīmo bloku, kā arī izveidosim virkni id numerācijai un izveidosim tabulu
STUDENTI_ATZIMES, kurā būs saglabāti dati no XMLTYPE tipa kolonnas no tabulas
STUDENTI_SEKMES.
Izveidosim virkni:CREATE SEQUENCE SEQ1
MINVALUE 1MAXVALUE 9999START WITH 1INCREMENT BY 1CACHE 10;Izveidosim tabulu datu glabāšanai:
Create Table Studenti_Atzimes (Id Number(10) Not Null Primary Key,Vards Varchar2(50),Uzvards Varchar2(50),Pusgads Number (10),Prieksmets Varchar2 (50),atzime number(10));
Uzrakstīsim anonīmo bloku, kas no tabulas STUDENTI_SEKMES XMLTYPE kolonnas
atzīmes ievietos relāziju tabulā STUDENTI_ATZIMES.DECLARE
A_XML_DATA XMLTYPE;A_ID NUMBER(10);A_VARDS VARCHAR2(50);A_Uzvards Varchar2(50);Fizika Number(10);Matematika Number(10);Kimija Number(10);Datu_Bazes Number(10);I number(10) :=0;CURSOR STUD_KURSORS ISSelect A.Id, A.Vards, A.Uzvards, A.Xml_DataFROM STUDENTI_SEKMES A;
BEGINOPEN STUD_KURSORS;Loop
FETCH STUD_KURSORS INTO A_ID, A_VARDS, A_UZVARDS, A_XML_DATA;Exit When Stud_Kursors%Notfound;
LoopI := I + 1;Kimija :=
A_Xml_Data.Extract('/pusgadi/pusgads[@id="'||I||'"]/kimija/text()').Getnumberval(); insert into studenti_atzimes (id, vards,uzvards,pusgads,prieksmets,atzime )values
(seq1.nextval, A_vards, A_uzvards, i, 'Kimija', kimija); Fizika :=
A_Xml_Data.Extract('/pusgadi/pusgads[@id="'||I||'"]/fizika/text()').Getnumberval(); insert into studenti_atzimes (id, vards,uzvards,pusgads,prieksmets,atzime )values
(seq1.nextval, A_vards, A_uzvards, i, 'fizika', fizika); Datu_Bazes :=
A_Xml_Data.Extract('/pusgadi/pusgads[@id="'||I||'"]/datu_bazes/text()').Getnumberval(); insert into studenti_atzimes (id, vards,uzvards,pusgads,prieksmets,atzime )values
(seq1.nextval, A_vards, A_uzvards, i, 'datu_bazes', datu_bazes); Matematika :=
A_Xml_Data.Extract('/pusgadi/pusgads[@id="'||I||'"]/matematika/text()').Getnumberval(); insert into studenti_atzimes (id, vards,uzvards,pusgads,prieksmets,atzime )values
(seq1.nextval, A_vards, A_uzvards, i, 'matematika', matematika); IF (i >= 4) THEN
i := 0;EXIT;
END IF;End Loop;
END LOOP;CLOSE STUD_KURSORS;End;Anonīmais bloks ieraksta tabulā visas studentu atzīmes visos priekšmetos visos pusgados.
Lai pārbaudītu anonīmā bloka darbību, izpildīsim sekojošo vaicājumu, kas attēlots attēlā 8.1. Kā
redzams, viss veiksmīgi nostrādāja. Mēs ieguvām relāciju datus no XML datiem.
8.1. att. Studentu atzīmes relāciju veidā
Otras pieejas realizācijai uzrakstīsim nelielu procedūru, kas ņems datus no XML faila un
ievietos tos relāciju tabulā. Tam nolūkam izveidosim sekojošo XML failu.<?xml version="1.0"?><ADRESES>
<ADRESE><ID>1</ID><PILSETA>Daugavpils</PILSETA><IELA>2 Precu iela</IELA><MAJAS_NR>1</MAJAS_NR><DZIVOKLA_NR>2</DZIVOKLA_NR>
</ADRESE><ADRESE>
<ID>2</ID><PILSETA>Preili</PILSETA><IELA>Sarkandaugavas</IELA><MAJAS_NR>3</MAJAS_NR><DZIVOKLA_NR>4</DZIVOKLA_NR>
</ADRESE><ADRESE>
<ID>3</ID><PILSETA>Skulte</PILSETA><IELA>Liela</IELA><MAJAS_NR>66</MAJAS_NR><DZIVOKLA_NR>77</DZIVOKLA_NR>
</ADRESE></ADRESES>
Kā arī tabulu datu glabāšanai.Create Table ADRESES (
Id Number (10) Not Null Primary Key,Pilseta Varchar2 (50),Iela Varchar2 (50),Majas_Nr Number (10),DZIVOKLA_NR NUMBER (10))
Procedūra:CREATE OR REPLACE PROCEDURE XML_TO_REL (X_DIR IN VARCHAR2, X_FILENAME IN VARCHAR2)ASL_BFILE BFILE := BFILENAME (X_DIR, X_FILENAME);L_CLOB CLOB;Insctx Dbms_Xmlstore.Ctxtype;ROWS1 NUMBER;BEGIN
Dbms_Lob.Createtemporary (L_Clob, True);DBMS_LOB.FILEOPEN (L_BFILE, DBMS_LOB.FILE_READONLY);DBMS_LOB.LOADFROMFILE (L_CLOB, L_BFILE, DBMS_LOB.GETLENGTH(L_BFILE));DBMS_LOB.FILECLOSE(L_BFILE);
INSCTX:=DBMS_XMLSTORE.NEWCONTEXT('ADRESES');Dbms_Xmlstore.Clearupdatecolumnlist(Insctx);DBMS_XMLGEN.SETROWSETTAG(INSCTX, 'ADRESES');DBMS_XMLSTORE.SETROWTAG(INSCTX, 'ADRESE');DBMS_XMLSTORE.SETUPDATECOLUMN (INSCTX,'ID');DBMS_XMLSTORE.SETUPDATECOLUMN (INSCTX,'PILSETA');DBMS_XMLSTORE.SETUPDATECOLUMN (INSCTX,'IELA');DBMS_XMLSTORE.SETUPDATECOLUMN (INSCTX,'MAJAS_NR');Dbms_Xmlstore.Setupdatecolumn (Insctx,'DZIVOKLA_NR');ROWS1:=DBMS_XMLSTORE.INSERTXML(INSCTX,L_CLOB);Dbms_Xmlstore.Closecontext(Insctx);
END;
Procedūra strādā, ņemot par parametriem xml faila atrašanās vietu (direktorija un faila
vārds). Palaižot procedūru, vispirms tiek nolasīts XML fails, kas saglabājas mainīgajā L_CLOB.
Vēlāk šis mainīgais tiek apstrādāts (tiek noteiktas nepieciešamās iezīmes, kas nosaka kolonnas
un rindiņas tabulā) un dati tiek ievietoti tabulā ADRESES.
Lai pārbaudītu procedūras validāti, pēc tās palaišanas izpildīsim sekojošo vaicājumu, kas
ir attēlots attēlā 8.2:
8.2. att. Adreses relāciju veidā
9. RELĀCIJU DATU IZVADĪŠANA XML DATU VEIDĀ
Izmantosim 3 metodes, kā izvadīt relāciju datus XML datu veidā. Izmantosim tam
nolūkam 2 relāciju tabulas, kuras izveidojām iepriekšējā nodaļā.
Kā pirmo metodi izmantosim SQL funkciju XMLELEMENT un papildfunkciju
XMLATTRIBUTES. Izvedeidosim no tabulas ADRESES XML dokumentu, kas dalīs datus pēc
iezīmes ADRESE ar atribūtu ID (veidojot šo relāciju tabulu (ADRESES), ID nebija atribūts, bet
gan atsevišķa iezīme, tādā veidā mēs iezīmi transformējām atribūtā).
Izpildīsim sekojošo vaicājumu:SELECT XMLELEMENT ("ADRESE",
XMLATTRIBUTES(ID AS "ID"),XMLELEMENT ("PILSETA", PILSETA),XMLELEMENT ("IELA", IELA),XMLELEMENT ("MAJAS_NR", MAJAS_NR),XMLELEMENT ("DZIVOKLA_NR", DZIVOKLA_NR)) AS result
from adreses;Vaicājuma rezultātu var apskatīta attēlā 9.1.
9.1. att. Tabula ADRESES XML veidā
Kā nākamo metodi izmantosim funkciju XMLSEQUENCE, kas atgriež XML kolekciju.
Izpildīsim sekojošo vaicājumu:SELECT XMLSEQUENCE (CURSOR (SELECT * FROM ADRESES)) AS RESULT FROM DUAL;
Vaicājuma rezultātu var apskatīta attēlā 9.2.
9.2. att. Tabula ADRESES XML veidā
Lai izpildītu uzdevumu pēc pēdējās metodes, nāksies uzrakstīt anonīmo bloku, kas
izvadīs ekrānā rezultātu, kas saglabāsies mainīgajā result (CLOB tipa). Tam nolūkam
izmantosim DBMS_XMLGEN paķeti (mēs to izmantojām arī iepriekšējā nodaļā, veidojot
relāciju datus no XML datiem). Anonīmai bloks relāciju tabulu STUDENTI_ATZIMES pārvērš
par XML, veidojot 2 jaunas iezīmes – ATZIMES kā globālo un ATZIME kā vienu rindiņu no
relāciju datu tabulas. Izpildīsim sekojošo vaicājumu:set serveroutput on;DECLAREx_handle DBMS_XMLGEN.ctxhandle;result CLOB;BEGINX_Handle := Dbms_Xmlgen.Newcontext('select * from studenti_atzimes');DBMS_XMLGEN.SETROWSETTAG (x_handle, 'ATZIMES');DBMS_XMLGEN.setrowtag (x_handle, 'ATZIME');result :=DBMS_XMLGEN.getXML(x_handle);DBMS_OUTPUT.PUT_LINE (result);Dbms_Xmlgen.Closecontext(X_Handle);END;
Vaicājuma rezultātu var apskatīta attēlā 9.3.
9.3. att. Tabula STUDENTI_ATZIMES XML veidā
SECINĀJUMI
Dotais praktiskais darbs mācību kursā DB3 bija diezgan apjomīgs un sarežģīts, kaut arī
no pirmā acu uzmetiena, tas rādījās viegli izpildāms.
Darba gaitā es iepazinos ar XML datu bāzes tehnoloģijām, jo īpaši XML sadarbību ar
Oracle DBVS. XML mūsdienās ir ļoti populārs uzdevumu risinājumam, tāpēc es uzskatu, ka
dotais darbs, kaut arī tas prasīja nenormāli daudz laika, ir ļoti derīga pieredze manā praksē.
Pildot doto uzdevumu, es iemācījos veidot XML failus, kā arī ģenerēt un modificēt, un
piesaistīt XML failiem XML shēmas (ģenerēt automātiski rīkā, bet pēc tam mazliet pielabojot
dažas niances). XML failu un shēmu veidošanai tika izmantots jaudīgs rīks Altova, kas ir viens
no populārākiem rīkiem XML redaktoru tirgū.
Es iepazinos ar tādām valodām kā Xpath un Xquery, kā arī ar Oracle paķetēm un
funkcijām darbam ar XML dokumentiem. Iemācījos iegūt relāciju datus no XML datiem, kā arī
otrādi dažādos veidos (bija savas grūtības, rakstot procedūras un anonīmos blokus datu
pārveidei, jo bija grūti saprast izmantojamo funkciju būtību, tomēr galu galā tas tika veiksmīgi
izpildīts).
Iepazinos ar XML datu glabāšanu datu bāzēs trijos veidos – strukturētā, nestrukturētā un
binārā veidā. Katram glabāšanas variantam ir savas priekšrocības un trūkumi, skatoties no
problēmsfēras uzdevuma nostādnes.
Darba gaitā bija prakse XML datu ievadē, kā arī vēlākā izgūšana, izmantojot PL/SQL,
Xquery ar Xpath un SQL ar Xpath vaicājumiem. Bija grūti saprast Xquery un Xpath darbības
principus, tomēr apskatot vairākus piemērus un izlasot mācību materiālus visas grūtības bija
pārvarētas.
Kopumā darbs aizņēma vairākus ilgus vakarus, bet tomēr tas tika veiksmīgi izpildīts.