saturs - web viewlai darba izpildē nebūtu problēmu ar to, ka oracle versija ir novecojusi...

51
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

Upload: vanthuan

Post on 04-Feb-2018

224 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: SATURS -    Web viewLai 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

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

Page 2: SATURS -    Web viewLai 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

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

Page 3: SATURS -    Web viewLai 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

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

Page 4: SATURS -    Web viewLai 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

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

Page 5: SATURS -    Web viewLai 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

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>

Page 6: SATURS -    Web viewLai 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

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

Page 7: SATURS -    Web viewLai 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

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>

Page 8: SATURS -    Web viewLai 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

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

Page 9: SATURS -    Web viewLai 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

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>

Page 10: SATURS -    Web viewLai 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

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

Page 11: SATURS -    Web viewLai 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

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ā

Page 12: SATURS -    Web viewLai 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

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

Page 13: SATURS -    Web viewLai 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

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;

Page 14: SATURS -    Web viewLai 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

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ā

Page 15: SATURS -    Web viewLai 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

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

Page 16: SATURS -    Web viewLai 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

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>

Page 17: SATURS -    Web viewLai 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

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

Page 18: SATURS -    Web viewLai 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

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

Page 19: SATURS -    Web viewLai 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

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

Page 20: SATURS -    Web viewLai 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

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

Page 21: SATURS -    Web viewLai 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

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

Page 22: SATURS -    Web viewLai 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

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

Page 23: SATURS -    Web viewLai 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

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

Page 24: SATURS -    Web viewLai 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

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

Page 25: SATURS -    Web viewLai 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

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

Page 26: SATURS -    Web viewLai 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

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ē

Page 27: SATURS -    Web viewLai 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

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.

Page 28: SATURS -    Web viewLai 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

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

Page 29: SATURS -    Web viewLai 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

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

Page 30: SATURS -    Web viewLai 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

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

Page 31: SATURS -    Web viewLai 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

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

Page 32: SATURS -    Web viewLai 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

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

Page 33: SATURS -    Web viewLai 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

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

Page 34: SATURS -    Web viewLai 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

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

Page 35: SATURS -    Web viewLai 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

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;

Page 36: SATURS -    Web viewLai 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

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.

Page 37: SATURS -    Web viewLai 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

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 (

Page 38: SATURS -    Web viewLai 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

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ā

Page 39: SATURS -    Web viewLai 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

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ā

Page 40: SATURS -    Web viewLai 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

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ā

Page 41: SATURS -    Web viewLai 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

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.