61
RĪGAS TEHNISKĀ UNIVERSITĀTE Datorzinātnes un informācijas tehnoloģijas fakultāte Lietišķo datorsistēmu institūts 4.praktiskais darbs mācību priekšmetā “Lielu datu bāzu tehnoloģija” Izstrādāja: Mārtiņš Dermanis 3.kurss, 4. grupa, 121RDB505 1

1. XML dokumenta izveidošana un reģistrēšana datu bāzē Web viewDatu ielādi no XML faila datu bāzē veikšu ar SQL*Loader rīku. Lai varētu to lietot, ... Windows 7

  • Upload
    lephuc

  • View
    226

  • Download
    6

Embed Size (px)

Citation preview

RĪGAS TEHNISKĀ UNIVERSITĀTE

Datorzinātnes un informācijas tehnoloģijas fakultāte

Lietišķo datorsistēmu institūts

4.praktiskais darbs

mācību priekšmetā

“Lielu datu bāzu tehnoloģija”

Izstrādāja: Mārtiņš Dermanis

3.kurss, 4. grupa, 121RDB505

2014./15. māc. gads

1

Contents1. XML dokumenta izveidošana un reģistrēšana datu bāzē..........................................3

2. XMLType tipa tabulas izveidošana nestrukturētā veidā..........................................6

3. Vaicājumu izveide un izpilde.....................................................................................9

PL/SQL.......................................................................................................................9

Xquery.....................................................................................................................15

SQL..........................................................................................................................17

4. Datu ievades varianti izveidotajās tabulās (RTU datu bāzē)...................................19

5. XML dokumentu shēmas izveidošana un reģistrēšana datu bāzē (manā datubāzē)....................................................................................................................................22

6. XMLType tipa tabulas izveidošana strukturētai, nestrukturētai un binārai glabāšanai...................................................................................................................28

Strukturēta glabāšana.............................................................................................28

Nestrukturēta glabāšana.........................................................................................28

Binārā glabāšana.....................................................................................................29

7. Datu ievades varianti izveidotajās tabulās (manā datu bāzē).................................30

9. Vaicājumi strukturētas un nestrukturētas glabāšanas XMLType tipa objektu tabulu analīzei....................................................................................................................... 36

10. XML glabājamo datu izvadīšana relāciju datu veidā............................................43

11. Relāciju datu izvadīšana XML datu veidā.............................................................47

12. Secinājumi............................................................................................................50

13. Lietotā literatūra...................................................................................................52

2

1. XML dokumenta izveidošana un reģistrēšana datu bāzē

No sākuma jāveido pats XML fails. Mans XML fails saturēs datus par programmām līdzīgi, kā iepriekšējos darbos lietotais PROGRAM objektu tips.

Objektu tips manā datubāzē:create or replacetype PROGRAM as object (Ident_numurs number(3,0),Nosaukums varchar2(30),Klasifikacija varchar2(30));

Izveidotais XML fails:

<?xml version="1.0"?><PROGRAMMAS>

<PROGRAMMA><IDENT_NUMURS>1</IDENT_NUMURS><NOSAUKUMS>Hemingvejs</NOSAUKUMS><KLASIFIKACIJA>Draiveris</KLASIFIKACIJA>

</PROGRAMMA><PROGRAMMA>

<IDENT_NUMURS>2</IDENT_NUMURS><NOSAUKUMS>Ziedu kareivis</NOSAUKUMS><KLASIFIKACIJA>Operetajsistema</KLASIFIKACIJA>

</PROGRAMMA></PROGRAMMAS>

Tālāk izveidošu datu bāzē tabulu PROGRAMMAS_XML, kas saturēs CLOB jeb Character Large Object, kas ir rakstzīmju lielie objekti un ir veidoti, lai saturētu ievades datus kā objektus un tādā veidā tos arī pasniegtu datu bāzē. Šajā tabulā vēlāk tiks ielādēti iepriekš aprakstītie programmu dati XML formātā.

create table PROGRAMMAS_XML(PROGR_TAB_ID number(5,0),PROGR_OBJ clob,constraint "PROGR_XML_ATSL" primary key ("PROGR_TAB_ID"));

3

Datu ielādi no XML faila datu bāzē veikšu ar SQL*Loader rīku. Lai varētu to lietot, no sākuma jāveido ctl jeb control fails, kas veic augšupielādes darbības definēšanu. Mans progr_ielade.ctl kontroles fails:

load datainfile progr.txtinto table programmas_xml truncatefields terminated by ','(PROGR_TAB_ID char(10),xml_file_name filler char(100),PROGR_OBJ lobfile(xml_file_name) terminated by eof)

Infile komanda norāda uz to, ka dati par apskatāmo failu (neivs pats xml fails) tiek glabāts progr.txt. into table programmas_xml norāda tabulu, kur xml faila objekts tiks glabāts (to es izveidoju iepriekš).

progr.txt fails:

1,progr.xml

Norāda xml failu, kurš tiks augšupielādēts norādītajā tabulā kā lielais objekts. 1 ir kārtas skaitlis, PROGR_TAB_ID vērtība, kas identificē datu bāzē izveidotajā tabulā lielo objektu tabulā šo lielo objektu.

Tālāk varu veikt augšupielādi ar sql*loader programmu. Tās izraksts:

Sql*Loader programmu izsaucošās komandas apraksts :sqlldr [lietotāja vārds]/[parole]@[servera IP]:[ports]/[SID] control=[kontroles fails]

4

Augšupielādētais objekts:

Tātad šādi var ielādēt XML failu datu bāzē.

5

2.  XMLType tipa tabulas izveidošana nestrukturētā veidā

XMLType tipa tabulas nestrukturētā ir veidotas no iepriekš minētajiem CLOB objektiem, kur tiek ievietoti XML formātā definēti dati. Tālāk šos datus ar šādiem objektiem paredzētām komandām var izgūt un izmantot vaicājumos. Sāksim darbu izveidojot XMLType tipa objektu tabulu.

create table PROGRAMMAS_XMLT of XMLTypeXMLTYPE store as CLOB;

Tālāk jāievieto XML formātā definēts objekts izveidotajā tabulā. Šajā gadījumā uzskaitīšu programmas, kas instalētas uzņēmuma darba stacijās.

insert into PROGRAMMAS_XMLT values (XMLType('<darba_stacija ID_Numurs="1"> <programma klasifikacija="Operetajsistema">Windows 7</programma> <programma klasifikacija="Draiveris">Zumbo</programma><programma klasifikacija="Datorspele">Karš nekad nemainās</programma> </darba_stacija>'));

insert into PROGRAMMAS_XMLT values (XMLType('<darba_stacija ID_Numurs="2"> <programma klasifikacija="Operetajsistema">Metalgriezejs</programma><programma klasifikacija="Draiveris">Horus</programma><programma klasifikacija="Teksta_redaktors">Ja vari, salasi</programma></darba_stacija>'));

Apskatīsim izveidotos objektus:

select Value(a) from PROGRAMMAS_XMLT a;

6

Tātad izdevās ievadīt divus XMLType tipa objektus, kas satur XML formātā aprakstītu objektu. Nestrukturētā veidā glabātie objekti ir saglabāti ar ievadītā XML faila struktūru, kas padara datu izgūšanu XML failā vieglāku.

Vēl izveidošu vienu tabulu, kur XMLType ir atribūts un nav vienīgā tabulas sastāvdaļa.Tā saturēs datus ne tikai par darba staciju, bet arī par darbinieku, kas pie tās strādā. Tas būs vajadzīgs vaicājumu izpētei. Tabulas izveide:

create table PROGRAMMAS_XMLT2(ID_CIPARS NUMBER (5,0) NOT NULL PRIMARY KEY,VARDS VARCHAR2(50) NOT NULL,UZVARDS VARCHAR2(50) NOT NULL,D_STAC XMLTYPE NOT NULL);

Datu ievade:

insert into PROGRAMMAS_XMLT2 values (1,'Artūrs','Zirgspalvis',XMLType('<darba_stacija ID_Numurs="1"> <programma klasifikacija="Operetajsistema">Windows 7</programma> <programma klasifikacija="Draiveris">Zumbo</programma><programma klasifikacija="Datorspele">Karš nekad nemainās</programma> </darba_stacija>'));

7

insert into PROGRAMMAS_XMLT2 values (2,'Mārtiņš','Dermanis',XMLType('<darba_stacija ID_Numurs="2"> <programma klasifikacija="Operetajsistema">Metalgriezejs</programma><programma klasifikacija="Draiveris">Horus</programma><programma klasifikacija="Teksta_redaktors">Ja vari, salasi</programma></darba_stacija>'));

Tabulu izveidot izdevās.

8

3. Vaicājumu izveide un izpilde

PL/SQL

Izpildīšu dažus vaicājumus ar nestrukturētā veidā radīto XMLType tipa objektu tabulu PROGRAMMAS_XMLT.

select EXTRACT(OBJECT_VALUE, '/darba_stacija/programma') "PROGRAMMA"from PROGRAMMAS_XMLT;

Lai varētu vaicājuma rezultāta datus varētu labāk apskatīt, tos ievietošu dokumentā vienu pēc otra.

Pirmais ieraksts (darba stacijai ar ID 1):

<programma klasifikacija="Operetajsistema">Windows 7</programma><programma klasifikacija="Draiveris">Zumbo</programma> <programma klasifikacija="Datorspele">Karš nekad nemainās</programma>

Otrais ieraksts (darba stacijai ar ID 2):

<programma klasifikacija="Operetajsistema">Metalgriezejs</programma> <programma klasifikacija="Draiveris">Horus</programma> <programma klasifikacija="Teksta_redaktors">Ja vari, salasi</programma>

Kā redzams, abos ierakstos ir norādītas tikai programmu aprakstošās XMLType objekta daļas, jo vaicājumā norādīju, ka gribu tikai informāciju par programma tagā ievietoto informāciju.select EXTRACT(OBJECT_VALUE, '/darba_stacija/programma')

Var arī apskatīt tikai programmu nosaukumus bez programma tagiem, norādot mērķa tagā mainīgo text().

9

select EXTRACT(OBJECT_VALUE, '/darba_stacija/programma/text()') "PROGRAMMA"from PROGRAMMAS_XMLT;

Kā redzams, tiek parādītas tikai programma tagā esošās vērtības.

Var arī atlasīt tikai pirmo noteiktam ierakstam jeb darba stacijai atbilstošo taga vērtību, norādot, kurš pēc kārtas tags tiks aprakstīts ar [1] operatoru.

select EXTRACT(OBJECT_VALUE, '/darba_stacija/programma[1]/text()') "PROGRAMMA"from PROGRAMMAS_XMLT;

Kā redzams, tika izvadīti tikai operētājsistēmu nosaukumi, kas bija norādīti pirmie ievadītajos XML objektos.

Var arī izmantot izvadāmā taga norādei meitas mezglu jēdzienu, kas šajā gadījumā ir programma mezgli.

select EXTRACT(OBJECT_VALUE, '/child::darba_stacija/*/text()') "PROGRAMMA"from PROGRAMMAS_XMLT;

10

Kā redzams, izvadītie dati ir tādi paši, kā iepriekšējā vaicājumā, kur izvadīju visus programmu nosaukumus. Tātad šī metode vaicājuma izveidē tiešām strādā.

Vēl vaicājumā varētu meklēt tikai, piemēram, programmas, kuras ir operētājsistēmas. Tātad klasifikācija atribūta vērtībai ir jābūt Operetajsistema. Uz atribūtu vērtībām var norādīt ar @ simbolu.

Select EXTRACT(OBJECT_VALUE, '//programma[@klasifikacija = "Operetajsistema"]') "PROGRAMMA" from PROGRAMMAS_XMLT;

Tika izvadītas tikai operētājsistēmas, tātad vaicājums izpilda atlasīšanas darbību pareizi. Var arī veikt XMLType esošo objektu atribūtu pielietošanu vaicājuma WHERE sadaļā ar operatoru. Šeit būs nepieciešams izmantot tabulu PROGRAMMAS_XMLT2, kur XMLType tipa objekts nav vienīgais atribūts ierakstā.

Existsnode komanda pārbauda, vai eksistē tāds elements attiecīgā ieraksta norādītajā XMLType tipa objekta atribūtā ir norādīta meklētā vērtība. Šajā gadījumā meklēju to ierakstu, kura XMLType tipa atribūtā kādai no programmām ir norādīta „klasifikacija” atribūtā vērtība „Datorspele”. Tātad tiek meklēta darba stacija, kurā ir uzinstalēta datorspēle. Artūra Zirgspalvja darba stacijā ir uzinstalēta datorspēle, bet Mārtiņa Dermaņa nav.

Select A.VARDS, A.UZVARDS, A.D_Stac FROM PROGRAMMAS_XMLT2 A Where Existsnode (A.D_Stac,'/darba_stacija/programma[@klasifikacija= "Datorspele"]')=1;

Tā kā datorspēle atradās tika instalēta tikai uz Artūra datora, bet ne uz Mārtiņa, un atlasīts ir tikai Artūra datubāzes ieraksts.

11

Esmu aplūkojis PL/SQL valodai SQL daļu, tagad izpildīšu darbību, kas iesaista PL/SQL loģiku anonīmā blokā ar kursoru. Šim vaicājumam izveidošu savu apstrādājamu tabulu, kurā būs aprakstīti kubu augstumi, platumi un garumi.

create table TILPUMS_XMLT(Nosaukums varchar2 (30) NOT NULL PRIMARY KEY,DIMENS XMLTYPE NOT NULL);

Datu ievade:

insert into TILPUMS_XMLT values ('Pirmais Pareizais',XMLType('<dimensijas> <dimensija nosaukums="augstums">7</dimensija> <dimensija nosaukums="platums">3</dimensija><dimensija nosaukums="garums">2</dimensija> </dimensijas>'));

insert into TILPUMS_XMLT values ('Pirmais Nepareizais',XMLType('<dimensijas> <dimensija nosaukums="augstums">-7</dimensija> <dimensija nosaukums="platums">3</dimensija><dimensija nosaukums="garums">2</dimensija> </dimensijas>'));

insert into TILPUMS_XMLT values ('Otrais Nepareizais',XMLType('<dimensijas> <dimensija nosaukums="augstums">4</dimensija> <dimensija nosaukums="platums">3</dimensija><dimensija nosaukums="garums">4</dimensija> </dimensijas>'));

insert into TILPUMS_XMLT values ('Otrais Nepareizais',XMLType('<dimensijas> <dimensija nosaukums="augstums">4</dimensija> <dimensija nosaukums="platums">0</dimensija><dimensija nosaukums="garums">0</dimensija> </dimensijas>'));

12

Veidošu vaicājumu, kas atlasīs tos kubus, kuri ir īsti kubi (visas to dimensijas ir lielākas par 0). Divi no kubiem ir īsti, bet divi nav. Nosaukumā apzīmēju tos, kuri ir pareizi, un tos, kas nav. Vaicājums atlasīs pareizos kubus un tad sareizinās dimensijas, lai iegūtu tilpumus.

set serveroutput onDECLARE

K_DIM_DATI XMLTYPE;K_NOSAUKUMS VARCHAR2(40);AUGSTUMS NUMBER;GARUMS NUMBER;PLATUMS NUMBER;TILPUMS NUMBER;

CURSOR TILPUMA_KURSORS ISSelect A.NOSAUKUMS, A.DIMENSFROM TILPUMS_XMLT AWhereEXTRACTVALUE (A.DIMENS,

'/dimensijas/dimensija[@nosaukums="augstums"]')>0 andEXTRACTVALUE (A.DIMENS,

'/dimensijas/dimensija[@nosaukums="platums"]')>0 andEXTRACTVALUE (A.DIMENS,

'/dimensijas/dimensija[@nosaukums="garums"]')>0;

BEGIN

OPEN TILPUMA_KURSORS;LOOP

FETCH TILPUMA_KURSORS INTO K_NOSAUKUMS, K_DIM_DATI;EXIT WHEN TILPUMA_KURSORS%NOTFOUND;

AUGSTUMS:= K_DIM_DATI.extract('/dimensijas/dimensija[@nosaukums="augstums"]/text()').getnumberval();

GARUMS:= K_DIM_DATI.extract('/dimensijas/dimensija[@nosaukums="garums"]/text()').getnumberval();

13

PLATUMS:= K_DIM_DATI.extract('/dimensijas/dimensija[@nosaukums="platums"]/text()').getnumberval();

TILPUMS:= (AUGSTUMS * GARUMS * PLATUMS);DBMS_OUTPUT.PUT_LINE ('Nosaukums: ' ||K_NOSAUKUMS);DBMS_OUTPUT.PUT_LINE ('Tilpums: ' ||TILPUMS);

END LOOP;CLOSE TILPUMA_KURSORS;END;

Iegūtais izraksts:

Kā redzams, vaicājumā arī var veikt PL funkcijas un procedūru programmēšanas valodas veidā rēķināti izgūtas vērtības no XMLTYPE tipa objektiem.

14

Xquery

Xquery izpilda vaicājumus XMLType objekta iekšpusē, izpildot vaicājumu loģiku iekš XML vides, to vērtības atlasot kā simbolu virknes. Xquery var apstrādātprogrammu nosaukumu vērtības kā simbolu virknes, piemēram, izgūstot tikai tos programmu nosaukumus, kuri beidzas ar burtu s.

Select A.Vards, A.Uzvards, Xmlquery ('for $x in /darba_stacija/programmawhere ends-with($x , "s")return data($x)'passing A.D_Stac RETURNING CONTENT) S_ProgrammasFROM programmas_xmlt2 A;

Kā redzams, atlasīti tikai nosaukumi, kuri beidzās ar burtu s. Tātad Xquery $x mainīgajā ielasa dažādos elementus un tālāk tos apstrādā kā simbolu virknes, kas ļauj strādāt tādām komandām kā pēdējā simbola salīdzināšana.

Vēl var veikt WHERE sadaļā SQL loģikas realizāciju paša XMLType elementa iekšpusē.

Select A.Vards, A.Uzvards, Xmlquery('for $x in /darba_stacija/programmawhere $x[@klasifikacija="Operetajsistema"] or $x[@klasifikacija="Datorspele"] return (data($x))'passing A.D_Stac RETURNING CONTENT) S_ProgrammasFROM programmas_xmlt2 A;

Kā redzams, katra programma tagā esošā vērtība tiek pārbaudīta un tiek apskatīts, vai tā ir operētājsistēma, vai Datorspēle. Tā kā Artūra datorā, kā minēju iepriekš, ir

15

instalēta spēle un operētājsistēma, bet Mārtiņa tikai operētājsistēma, Artūra izgūtajā S_PROGRAMMAS vērtībā ir divi programmu nosaukumi, bet Mārtiņa ir viens.

Tātad ir iespējams realizēt ar OR un AND operatoriem where daļā vaicājumam iekš XMLType objekta datu atlases loģiku pēc atribūtiem un, kā bija redzams pirms tam izveidotajā vaicājumā, loģiku pēc mezglu vērtībām. Arī jāņem vērā to, ka programma vērtības tiek ielasītas vienas pēc otras, nevis kā viens kopīgs vesels, kas, protams, ir svarīgi, ja jāatlasa noteiktas XMLType tipa objekta XML tagu vērtības pēc nosacījumiem, kuru vērtības arī ir saturētas XML objektā`.

Var secināt, ka Xquery, tā vietā, lai vienkārši izgūtu datus un apstrādātu tos PL/SQL valodā kā atribūtus, izpilda SQL loģikas vaicājumus pašā XML vidē un ar „passing A.D_Stac RETURNING CONTENT” izgūst datus pēc vaicājuma izpildes kā PL/SQL valodas atribūtus. Tātad var izpildīt dažāda veida vaicājumus XML vidē tāpat kā to darītu SQL izveidotās tabulās vai skatos.

16

SQL

No sākuma izvadīsim visus lielos objektus (CLOB).

select a.getcLOBVal() from PROGRAMMAS_XMLT a;

Select A.Vards, A.Uzvards, A.D_Stac.Extract('/darba_stacija/programma[3]/text()').Getstringval() As Papildus_programma,A.D_Stac.Extract('/darba_stacija/programma[@klasifikacija="Operetajsistema"]/text()').Getstringval() As Operētājsistēma,A.D_Stac.Extract('/darba_stacija/programma[@klasifikacija="Draiveris"]/text()').Getstringval() As DraiverisFROM programmas_xmlt2 A;

Kā redzams, SQ: valodā definētie Extract vaicājumi pilda savu darbu pareizi un darbības princips ir līdzīgs PL/SQL komandām, bet jānorāda kāda tipa dati tiek izgūti (piemēram Getstringval()).Vēl var izmantot Extractvalue vaicājuma WHERE daļā, kas ļauj veikt ieraksta kritēriju izveidi ar XML datiem. Papildināšu iepriekšējo vaicājumu tā, ka tiek atlasīti to darba staciju dati, kuros nav instalētas Windows 7 operētājsistēmas.

Select A.Vards, A.Uzvards, A.D_Stac.Extract('/darba_stacija/programma[3]/text()').Getstringval() As Papildus_programma,A.D_Stac.Extract('/darba_stacija/programma[@klasifikacija="Operetajsistema"]/text()').Getstringval() As Operētājsistēma,A.D_Stac.Extract('/darba_stacija/programma[@klasifikacija="Draiveris"]/text()').Getstringval() As DraiverisFROM programmas_xmlt2 AWHERE EXTRACTVALUE

17

(A.D_STAC,'/darba_stacija/programma[@klasifikacija="Operetajsistema"]/text()') <> 'Windows 7' ;

Tika atlasīta tikai darba stacija, kur bija instalēta operētājsistēma „Metalgriezejs”, bet Artūra darba stacija, kur ir instalēta Windows 7 operētājsistēma, netika atlasīta. SQL vaicājumi ļauj izgūt vienkāršā līmenī datus no XMLType tipa objekta un tos apstrādāt kā vienu veselu, nevis kā, piemēram, ar Xquery atlasīt un apstrādāt tagiem piesaistītās vērtības atšķirīgi.

18

4. Datu ievades varianti izveidotajās tabulās (RTU datu bāzē)

Iepriekš apskatīju datu ievadi ar vienkāršu INSERT INTO komandu. Tas praktiskā darbā ir nedaudz bezjēdzīgi, jo vieglāk droši vien būtu vienkārši izveidot objektus un tajos ievadīt šos datus. Praksē šādi XMLType dokumenti visticamāk saturēs datus, kas ir izgūti no XML faila. Šādas ievades veikšana ir mans nākošais uzdevums. Ievadi veikšu nestrukturētajā veidā veidotajā XMLType tipa tabulā PROGRAMMAS_XMLTNo sākuma izveidošu XML failu ar vienu darba_stacija objektu, kurā būs divi meitas mezgli jeb programmas. XML fails d_stac:

<?xml version="1.0" encoding="UTF-8"?><darba_stacija ID_Numurs="3"> <programma klasifikacija="Operetajsistema">Kamja_ritenis</programma> <programma klasifikacija="Antiviruss">Kaspersky Execution Squad</programma> </darba_stacija>

Tālāk datu bāzē ievadīšu uz failu katalogu, kur atrodas XML fails, norādošu mainīgo, bet to nevarēju izdarīt, jo man ortus serverī netika dotas pietiekami augsta autorizācija:

create or replace directory XMLDIR as 'C:/';

Izvadītā kļūda:

Error starting at line 1 in command:create or replace directory XMLDIR as 'C:/'Error at Command Line:1 Column:0Error report:SQL Error: ORA-01031: insufficient privileges01031. 00000 - "insufficient privileges"*Cause: An attempt was made to change the current username or password without the appropriate privilege. This error also occurs if attempting to install a database without the necessary operating system privileges. When Trusted Oracle is configure in DBMS MAC, this error may occur if the user was granted the necessary privilege at a higher label than the current login.*Action: Ask the database administrator to perform the operation or grant the required privileges.

19

For Trusted Oracle users getting this error although granted the the appropriate privilege at a higher label, ask the database administrator to regrant the privilege at the appropriate label.

Tā ir liela problēma, jo, veicot augšupielādi, vajag norādīt šo kataloga mainīgo un failu, kas atrodas katalogā. Pati augšupielāde:

insert into PROGRAMMAS_XMLT values (xmltype( bfilename('XMLDIR,'d_stac.xml'), nls_charset_id('AL32UTF8') ) );

Tas, protams, nestrādā, jo nav definēts XML_KATAL mainīgais.

Error report:SQL Error: ORA-22285: non-existent directory or file for FILEOPEN operationORA-06512: at "SYS.XMLTYPE", line 296ORA-06512: at line 122285. 00000 - "non-existent directory or file for %s operation"*Cause: Attempted to access a directory that does not exist, or attempted to access a file in a directory that does not exist.*Action: Ensure that a system object corresponding to the specified directory exists in the database dictionary, or make sure the name is correct.

Tālāk mēģināju tieši ievadīt katalogu, nevis izmantot mainīgo.insert into PROGRAMMAS_XMLT values (xmltype( bfilename('C:/','d_stac.xml'), nls_charset_id('AL32UTF8') ) );

Tika izvadīta tā pati kļūda. Mēģināju precīzi norādīt faila atrašanās vietu:

insert into PROGRAMMAS_XMLT values (xmltype( bfilename('C:/d_stac.xml'), nls_charset_id('AL32UTF8') ) );

Error report:SQL Error: ORA-00909: invalid number of arguments00909. 00000 - "invalid number of arguments"*Cause: *Action:

20

Tātad ir jābūt diviem dažādiem mainīgajiem bfilename metodē. Līdz ar to varu secināt, ka nevaru šo uzdevumu izpildīt, bet tikai parādīt kā to teorētiski vajadzētu izpildīt. Tā kā nevar norādīt katalogus, nav iespējams arī ielādēt shēmas, kas nozimē, ka nav iespējams veikt, protams, shēmas ielādi un reģistrēšanu, kā arī strukturētas glabāšanas XMLType tipa tabulu, jo tā balstās uz shēmu.

Šai darbībai vajadzēja pievienot tabulai XMLType failā esošo saturu kā ierakstu.

Lai darbā būtu vispār iespējams izdarīt aptuveni pusi no uzdevuma, esmu spiests veidot savu datu bāzi.

21

5. XML dokumentu shēmas izveidošana un reģistrēšana datu bāzē (manā datubāzē)

Ar database creation assistant rīku izveidoju datu bāzi un tai pieslēdzos.

create or replace directory XMLDIR as 'C:/';directory XMLDIR created.

Tātad varu sākt darbu ar jebkādu XML failu augšupielādi.

Lai varētu izveidot strukturētas un bināras glabāšanas veida XMLType tipa objektu tabulas, vajag reģistrēt shēmas, pēc kurām augšupielādētie XML failu dati tiks strukturēti. Kā apskatīts iepriekš, nestrukturētus XMLType elementus var izveidot arī bez shēmām, jo tiem nav struktūras, bet tiem var arī piedēvēt shēmas.

No sākuma jāizveido pats XML fails, lai zinātu, kam struktūru vispār veidot. Es veidošu XML failu, kas saturēs informāciju par programmētāju komandām (līdzīgi kā pirmajā darbā), bet bez pabeigtām un nepabeigtām programmām arī norādīšu datus par darbiniekiem, kas strādā attiecīgajā komandā.

Izveidotais fails:

<?xml version="1.0" encoding="UTF-8"?><komandas> <komanda> <apraksts>

<nosaukums>Brali Lauvas</nosaukums> <birojs>A7</birojs></apraksts><darbinieki> <darbinieks> <vards>Martins</vards>

<uzvards>Dermanis</uzvards><alga>450</alga>

</darbinieks> <darbinieks> <vards>Sebastians</vards>

<uzvards>Kostalliano</uzvards><alga>459</alga>

</darbinieks>

22

</darbinieki> <pab_progr>

<programma> <nosaukums>Metalgriezejs</nosaukums>

<klasifikacija>Operetajsistema</klasifikacija><izmers>1220</izmers>

</programma> <programma> <nosaukums>Kamis</nosaukums>

<klasifikacija>Draiveris</klasifikacija><izmers>52</izmers>

</programma> </pab_progr> <nepab_progr>

<programma> <nosaukums>Henrihs</nosaukums>

<klasifikacija>Datorspele</klasifikacija><izmers>2222</izmers>

</programma> </nepab_progr> </komanda> <komanda> <apraksts>

<nosaukums>Bediga nave</nosaukums> <birojs>A8</birojs></apraksts><darbinieki> <darbinieks> <vards>Janis</vards>

<uzvards>Visvarenais</uzvards><alga>422</alga>

</darbinieks> <darbinieks> <vards>Leons</vards>

<uzvards>Kenedijs</uzvards><alga>350</alga>

</darbinieks> <darbinieks> <vards>Juris</vards>

<uzvards>Liktenis</uzvards>

23

<alga>520</alga> </darbinieks></darbinieki>

<pab_progr> <programma> <nosaukums>Hopris</nosaukums>

<klasifikacija>Draiveris</klasifikacija><izmers>120</izmers>

</programma> <programma> <nosaukums>Sauj vai mirsti</nosaukums>

<klasifikacija>Datorspele</klasifikacija><izmers>1552</izmers>

</programma> <programma> <nosaukums>Agrak vai velak</nosaukums>

<klasifikacija>Rakesu vadibas sistema</klasifikacija><izmers>3452</izmers>

</programma> </pab_progr> <nepab_progr>

<programma> <nosaukums>Sparni</nosaukums>

<klasifikacija>operetajsistema</klasifikacija><izmers>4654</izmers>

</programma> <programma> <nosaukums>Lopiem ir jadzer</nosaukums>

<klasifikacija>Datubazes leitojums</klasifikacija><izmers>865</izmers>

</programma> </nepab_progr> </komanda> </komandas>

24

Izveidotajā XML failā ir aprakstītas divas komandas, kur vienai ir 2 darbinieki, 2 pabeigtas programmas un 1 nepabeigta, bet otrai ir 3 darbinieki, 3 pabeigtas programmas un 2 nepabeigtas. Tagad veidošu shēmu. Shēmā ir jādefinē, kāda struktūra ir vienam ierakstam jeb vienai komandai.Izveidotā shēma:

<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="komandas"> <xs:complexType> <xs:sequence> <xs:element name="komanda" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="apraksts"> <xs:complexType> <xs:sequence> <xs:element name="nosaukums" type="xs:string"/> <xs:element name="birojs" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="darbinieki"> <xs:complexType> <xs:sequence> <xs:element name="darbinieks" maxOccurs="unbounded" minOccurs="1"> <xs:complexType> <xs:sequence> <xs:element name="vards" type="xs:string"/> <xs:element name="uzvards" type="xs:string"/> <xs:element name="alga" type="xs:integer"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="pab_progr"> <xs:complexType> <xs:sequence> <xs:element name="programma" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="nosaukums" type="xs:string"/> <xs:element name="klasifikacija" type="xs:string"/> <xs:element name="izmers" type="xs:integer"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="nepab_progr"> <xs:complexType> <xs:sequence> <xs:element name="programma" maxOccurs="unbounded">

25

<xs:complexType> <xs:sequence> <xs:element name="nosaukums" type="xs:string"/> <xs:element name="klasifikacija" type="xs:string"/> <xs:element name="izmers" type="xs:integer"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element></xs:schema>

Shēmā norādītais maxOccurs="unbounded" ļauj ievietot vairākus šī tipa elementus, veidojot objektu kolekcijai līdzīgu konstrukciju. minOccurs=”1” nozīmē to, ka jābūt vismaz vienam šādam elementam. Manā gadījumā jābūt vismaz vienam darbiniekam komandā, vai tā vienkārši nav komanda.Tālāk jāveic shēmas reģistrēšana.

BEGINDBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL => 'http://localhost:8080/public/komands.xsd',SCHEMADOC => bfilename ('XMLDIR', 'komands.xsd'),CSID => nls_charset_id ('AL32UTF8'));

END;

Tālāk šo shēmu izmantošu dažādu glabāšanas veidu XMLType tipu objektu tabulu veidošanai SCHEMAURL norāda, kā shēma tiks saglabāta datu bāzē. SCHEMADOC norāda, no kura faila tiek paņemts shēmas fails. Šajā gadījumā ‘XMLDIR’ ir C:/, tātad fails tiek ņemts no C:/komands.xsd. CSID norāda simbolu kodējumu. Apskatīsim datu bāzē esošās shēmas:SELECT SCHEMA_URL FROM USER_XML_SCHEMAS;

26

Shēma piemers.xsd netiks tālāk lietota darbā un bija mazs piemērs pārbaudei, ka augšupielāde vispār strādā. Vēl ir jā pievieno binārai glabāšanai savu xml shēmu, kur norādīts, ka shēma ir veidota bināras glabāšanas veidam.

BEGINDBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL => 'http://localhost:8080/public/komandsp.xsd',SCHEMADOC => bfilename ('XMLDIR', 'komands.xsd'),CSID => nls_charset_id ('AL32UTF8'),

GENTYPES => FALSE,OPTIONS => REGISTER_BINARYXML);

END;

Tika izvadīta kļūda:

Error report:ORA-06550: line 7, column 13:PLS-00201: identifier 'REGISTER_BINARYXML' must be declaredORA-06550: line 2, column 2:PL/SQL: Statement ignored06550. 00000 - "line %s, column %s:\n%s"*Cause: Usually a PL/SQL compilation error.*Action:

Visticamāk tas ir tādēļ, ka man ir instalēts 10g R2 ORACLE lietojums, bet nepieciešama ir 11g versija. Diemžēl man ir iemesli atstāt šī brīža versiju, tādēļ binārā glabāšanas veida XMLType tipa tabulu nevarēšu izveidot. Tā vietā uzrakstīšu kā tam būtu jāstrādā.

27

6. XMLType tipa tabulas izveidošana strukturētai, nestrukturētai un binārai glabāšanai

Strukturēta glabāšana

Strukturētai glabāšanai vajag obligāti shēmu, ar kuru tā apstrādā ievadītos XML datus un pārveido PL/SQL datubāzei saprotamās konstrukcijās.

CREATE TABLE KOMANDAS_STR OF XMLTYPEXMLSCHEMA "http://localhost:8080/public/komands.xsd"ELEMENT "komandas";

Datu ievadi veikšu nākošajā nodaļā. Element mainīgais norāda uz to shēmas elementu, kurš apraksta visu izveidoto XML failu kā objektu vai objektu kopu. Tas ir sākotnējais XML faila elements, kurš tiek aizvērts XML failā pēdējais. XMLSCHEMA norāda uz lietoto reģistrēto XML shēmu.

Nestrukturēta glabāšana

Tabulās, kuras veidoju, lai parādītu dažādu vaicājumu darbību, izmantoju nestrukturētu datu glabāšanu. Tomēr, lai gan tas nav obligāti, ierobežojumu piedēvēšanai noteiktām XML failu tagu vērtībām var lietot shēmu.

CREATE TABLE KOMANDAS_NESTR (Ident_numurs NUMBER NOT NULL PRIMARY KEY,

XML_DATA XMLTYPE NOT NULL) XMLType COLUMN XML_DATA STORE AS CLOB XMLSCHEMA "http://localhost:8080/public/komands.xsd"ELEMENT "komandas";

Mainīgie element un XMLSCHEMA nozīmē to pašu, ko iepriekš. Kā redzams, dati tiks glabāti kā iepriekš minētie CLOB lielie rakstzīmju objekti.

28

Binārā glabāšana

CREATE TABLE KOMANDAS_BIN (ID NUMBER NOT NULL PRIMARY KEY,XML_DATA XMLTYPE NOT NULL

) XMLType COLUMN XML_DATA STORE AS BINARY XML XMLSCHEMA "http://localhost:8080/public/komandsp.xsd"ELEMENT "komandas";

Kā redzams, konstrukcija ir ļoti līdzīga nestrukturēta glabāšanas veida XMLType tipa objektu tabulas izveidei, bet dati netiek saglabāti kā lielie rakstzīmju objekti CLOB, bet gan kā BINARY XML objekti.

29

7. Datu ievades varianti izveidotajās tabulās (manā datu bāzē)

Tātad izveidoju divas tabulas, vienu, kas glabā XML datus strukturētā veidā un otru, kas glabā datus nestrukturētā veidā.

No sākuma apskatīšu XMLType tipa objektu tabulu ar strukturētu glabāšanu.

Veikšu datu ievadi izmantojot shēmas izstrādē aprakstīto komand.xml failu. Tā saturs:

<?xml version="1.0" encoding="UTF-8"?><komandas> <komanda> <apraksts>

<nosaukums>Brali Lauvas</nosaukums> <birojs>A7</birojs></apraksts><darbinieki> <darbinieks> <vards>Martins</vards>

<uzvards>Dermanis</uzvards><alga>450</alga>

</darbinieks> <darbinieks> <vards>Sebastians</vards>

<uzvards>Kostalliano</uzvards><alga>459</alga>

</darbinieks></darbinieki>

<pab_progr> <programma> <nosaukums>Metalgriezejs</nosaukums>

<klasifikacija>Operetajsistema</klasifikacija><izmers>1220</izmers>

</programma> <programma> <nosaukums>Kamis</nosaukums>

<klasifikacija>Draiveris</klasifikacija><izmers>52</izmers>

</programma>

30

</pab_progr> <nepab_progr>

<programma> <nosaukums>Henrihs</nosaukums>

<klasifikacija>Datorspele</klasifikacija><izmers>2222</izmers>

</programma> </nepab_progr> </komanda> <komanda> <apraksts>

<nosaukums>Bediga nave</nosaukums> <birojs>A8</birojs></apraksts><darbinieki> <darbinieks> <vards>Janis</vards>

<uzvards>Visvarenais</uzvards><alga>422</alga>

</darbinieks> <darbinieks> <vards>Leons</vards>

<uzvards>Kenedijs</uzvards><alga>350</alga>

</darbinieks> <darbinieks> <vards>Juris</vards>

<uzvards>Liktenis</uzvards><alga>520</alga>

</darbinieks></darbinieki>

<pab_progr> <programma> <nosaukums>Hopris</nosaukums>

<klasifikacija>Draiveris</klasifikacija><izmers>120</izmers>

</programma> <programma> <nosaukums>Sauj vai mirsti</nosaukums>

<klasifikacija>Datorspele</klasifikacija>

31

<izmers>1552</izmers> </programma> <programma> <nosaukums>Agrak vai velak</nosaukums>

<klasifikacija>Rakesu vadibas sistema</klasifikacija><izmers>3452</izmers>

</programma> </pab_progr> <nepab_progr>

<programma> <nosaukums>Sparni</nosaukums>

<klasifikacija>operetajsistema</klasifikacija><izmers>4654</izmers>

</programma> <programma> <nosaukums>Lopiem ir jadzer</nosaukums>

<klasifikacija>Datubazes leitojums</klasifikacija><izmers>865</izmers>

</programma> </nepab_progr> </komanda> </komandas>

Iepriekšējos uzdevumos (pirmajā un otrajā nodaļā) aprakstīju XML failu datu ielādi ar SQL*Loader rīku un ar komandām INSERT INTO SQL komandu. Pienācis laiks izmantot trešo metodi, kas ir līdzīga shēmas ielādei.

INSERT INTO KOMANDAS_STR VALUES (XMLType(bfilename('XMLDIR', 'komand.xml'), nls_charset_id('AL32UTF8')));

Šī arī ir INSERT INTO komanda, bet tā ielādē failu no norādītā kataloga (tāpat kā shēmas faila ielādē). Tagad ievadīšu tos pašus datus arī nestrukturētās glabāšanas tabulās divos veidos. Pirmajā es izmantošu to pašu komand.xml failu, bet otrajā es sadalīšu komand.xml failu divos failos, kur katrs fails apraksta vienu komandas objektu.

INSERT INTO KOMANDAS_NESTR VALUES (1,XMLType(bfilename('XMLDIR', 'komand.xml'), nls_charset_id('AL32UTF8')));

32

Izveidošu jauno nestrukturēto XMLType konstrukciju:

CREATE TABLE KOMANDAS_NESTR2 (Ident_numurs NUMBER NOT NULL PRIMARY KEY,

XML_DATA XMLTYPE NOT NULL) XMLType COLUMN XML_DATA STORE AS CLOB XMLSCHEMA "http://localhost:8080/public/komands.xsd"ELEMENT "komandas";

Tad sadalīju XML failu divās daļās un to pa daļām ielādēju (saturs ir tas pats).

INSERT INTO KOMANDAS_NESTR2 VALUES (1,XMLType(bfilename('XMLDIR', 'komand1.xml'), nls_charset_id('AL32UTF8')));

INSERT INTO KOMANDAS_NESTR2 VALUES (2,XMLType(bfilename('XMLDIR', 'komand2.xml'), nls_charset_id('AL32UTF8')));

Izveidotās tālāk apstrādāšu vaicājumos, kur analizēšu pāris atšķirības starp strukturēto un nestrukturēto glabāšanu.Pirms tam, kamēr vēl rakstu ievades nodaļu, aprakstīšu vienu no vissvarīgākajām atšķirībām starp strukturēto un nestrukturēto glabāšanu. Izveidoju divus jaunu xml failu komandnep.xml, kur ir tikai pirmās komandas (Brāļi Lauvas) dati, bet beigās pievienoju vienu papildus tagu <piemers>4</piemers>, kas, protams, nav norādīts shēmā.

Izveidosim vēl vienu strukturētas glabāšanas tabulu un tajā mēģināsim ielādēt šo failu.

CREATE TABLE KOMANDAS_STR2 OF XMLTYPEXMLSCHEMA "http://localhost:8080/public/komands.xsd"ELEMENT "komandas";

INSERT INTO KOMANDAS_STR2 VALUES (XMLType(bfilename('XMLDIR', 'komandnep.xml'), nls_charset_id('AL32UTF8')));

Tiek izvadīta kļūda:

33

Error report:SQL Error: ORA-30937: No schema definition for 'piemers' (namespace '##local') in parent '/komandas'30937. 00000 - "No schema definition for '%s' (namespace '%s') in parent '%s'"*Cause: The schema definition for the parent node being processed does not allow for the specified child node in its content model. Note that any typecasting via xsi:type must occur before the schema definitions for the new type can be used.*Action: Only insert elements and attributes declared in the schema. Check to make sure that xsi:type (if used) is specified first.

Tas notiek tādēļ, ka piemers tags nav ierakstīts shēmā. Tagad apskatīsim, kas notiek, ja ievada šo failu nestrukturētā XMLType tipa objektu tabulā.

CREATE TABLE KOMANDAS_NESTR3 (Ident_numurs NUMBER NOT NULL PRIMARY KEY,

XML_DATA XMLTYPE NOT NULL) XMLType COLUMN XML_DATA STORE AS CLOB XMLSCHEMA "http://localhost:8080/public/komands.xsd"ELEMENT "komandas";

INSERT INTO KOMANDAS_NESTR3 VALUES (1,XMLType(bfilename('XMLDIR', 'komandnep.xml'), nls_charset_id('AL32UTF8')));

1 rows inserted.

Kā redzams, nestrukturētajā glabāšanā pat ar piesaistītu shēmu, XMLType tipa objektos ļauj pievienot jebkādus datus, kādus lietotājs vien vēlas tik ilgi, kamēr shēmā aprakstītajiem datiem (ja tādi vispār ir minēti glabātajā XMLType objektā) ievēro shēmā norādītos ierobežojumus. Kopsavilkumā, strukturētajā glabāšanā shēma definē gan iespējamo XML failu konstrukciju, gan to ierobežojumus, bet nestrukturētajā tikai ierobežojumus. Tas var būt labi un slikti atkarībā no tā, ko vēlas darīt ar XML objektiem. Nestrukturētajā objektā var viegli pievienot atribūtus, kas vajadzīgi tikai vienā objektā, tādējādi dodot konstrukcijai elastību.

Turpretī, strukturētajā XMLType objektu tabulā tiek veikta ielādēto failu pārbaude, kas nodrošina XML faila datu piemērotības pārbaudi datu bāzē definētajiem objektiem. Šīs tabulas ir ātrdarbīgākas, jo ir precīzāk definēta objekta konstrukcija, kas ļauj ORACLE PL/SQL valodā to vieglāk apstrādāt.

34

Beigās tālākas atšķirību pētīšanas dēļ ievadīšu KOMANDAS_STR2 tabulā komand1.xml un komand2.xml failus, kas ir individuālās komandās sadalīts komand.xml fails. Tātad tas ir pēc uzbūves analoģisks KOMANDAS_NESTR2 tabulai.

INSERT INTO KOMANDAS_STR2 VALUES (XMLType(bfilename('XMLDIR', 'komand1.xml'), nls_charset_id('AL32UTF8')));

INSERT INTO KOMANDAS_STR2 VALUES (XMLType(bfilename('XMLDIR', 'komand2.xml'), nls_charset_id('AL32UTF8')));

35

9. Vaicājumi strukturētas un nestrukturētas glabāšanas XMLType tipa objektu tabulu analīzei

Kā definēt dažādu veidu vaicājumus XML tabulām aprakstīju trešajā nodaļā, tādēļ šeit nekoncentrēšos uz vaicājumu konstrukcijām, bet gan uz atšķirībām starp strukturētas un nestrukturētas glabāšanas veidiem.

Ar SQL vaicājumiem vienkārši apskatīsim visu četru izveidoto tabulu ievadītos CLOB jeb lielos rakstzīmju objektus.

select a.getcLOBVal() from KOMANDAS_STR a;

Izraksts turpinas tālāk un apraksta abas komandas

36

select a.getcLOBVal() from KOMANDAS_STR2 a;

Arī šajā izrakstā ir viens CLOB elementa izraksts, lai gan tika ievadīti divu XML failu dati.

37

select a. XML_DATA.getcLOBVal() from KOMANDAS_NESTR a;

Arī šeit tiek izvadīts viens CLOB elements.

select a.XML_DATA.getcLOBVal() from KOMANDAS_NESTR2 a;

38

39

Šeit ir redzama otrā lielā atšķirība starp strukturētu un nestrukturētu XMLType objektu atribūtu – strukturētā visi ievadītie XML failu dati tiek apvienoti vienā kopējā XML struktūrā, kuru definē shēma, bet nestrukturētā datubāzē atšķirīgi XML faili tiek apskatīti kā dažādi ieraksti un ir savstarpēji individuāli datu bāzē.

40

Vaicājumus nestrukturētu XMLType tipa objektu individuālai apstrādei, ja tie augšupielādēti atšķirīgi, var izmantojot PL/SQL un Xquery vaicājumus. PL/SQL labi nestrādās darbā ar strukturētiem objektiem, jo tie visi tiek apkopoti vienā CLOB objektā un nav atribūtu ārpus XML faila, kas norādīt kārtējo objektu, kā tas var būt darbā ar nestrukturētiem XMLType tipa objektiem. Xquery, turpretī, savu darbu pilda pilnvērtīgi, jo tā veic darbību pašā XML vidē. Izmantošu šo iespēju, lai arī parādītu datu izvadi XML formātā.

Izveidošu vaicājumu, kura mērķis ir XML formātā izvadīt katras komandas veidoto programmu kopējo aizņemto vietu datu bāzē (ko nosaka to izmērs). Vaicājums:

Select Xmlquery ('<Atmiņas_sadalījums>{for $x in //komandareturn <komanda nosaukums="{(data($x/apraksts/nosaukums))}">{for $y in //komandawhere $y//apraksts/nosaukums=$x/apraksts/nosaukumsreturn ( <Kopējā_aizņemtā_atmiņa_komandai>{(sum($y/pab_progr/programma/izmers) + sum($y/nepab_progr/programma/izmers))}</Kopējā_aizņemtā_atmiņa_komandai>)}</komanda>}</Atmiņas_sadalījums>'passing OBJECT_VALUE RETURNING CONTENT) Atmiņas_sadalījumsFROM KOMANDAS_STR;

41

Tā kā rezultāts nav sadalīts pa rindiņām, lai atvieglotu datu apskati, ievietošu šos datus NotePad++ rīkā.

<Atminas_sadalijums> <komanda nosaukums="Brali Lauvas"> <Kopeja_aiznemta_atmina_komandai>3494</Kopeja_aiznemta_atmina_komandai></komanda> <komanda nosaukums="Bediga nave"> <Kopeja_aiznemta_atmina_komandai>10643</Kopeja_aiznemta_atmina_komandai></komanda> </Atminas_sadalijums>

Vaicājums veiksmīgi atlasa datus par Brali lauvas un Bediga nave programmu kopējo aizņemto atmiņu.

42

10.  XML glabājamo datu izvadīšana relāciju datu veidā

No sākuma izveidošu tabulu, kas saturēs izvadītos XML datus. Tabulā saglabāšu katras komandas aprakstu (komandas nosaukumu un biroju, kurā komanda strādā).

create table Komandu_apraksts(id number,nosaukums varchar2(40),birojs varchar2(40));

Anonīmais PL/SQL bloks datu izgūšanai no XML formāta:

DECLAREXML_DATI XMLTYPE;ID_NUM NUMBER(10);Nosaukums Varchar2(40);Birojs Varchar2(40);CURSOR KOM_KURSORS IS

Select A.IDENT_NUMURS, A.XML_DATAFROM KOMANDAS_NESTR2 A;

BEGINOPEN KOM_KURSORS;Loop

FETCH KOM_KURSORS INTO ID_NUM, XML_DATI;Exit When KOM_KURSORS%Notfound;

Nosaukums := XML_DATI.Extract('/komandas/komanda/apraksts/nosaukums/text()').Getstringval(); Birojs := XML_DATI.Extract('/komandas/komanda/apraksts/birojs/text()').Getstringval(); insert into Komandu_apraksts (id, nosaukums,birojs) values (ID_NUM, NOSAUKUMS, BIROJS); END LOOP;CLOSE KOM_KURSORS;End;

43

Tabulas KOMANDU_APRAKSTS saturs (tajā tika ievadīti dati).

Vēl viena pieeja datu izvadei ir datu izguve no XML failiem tieši (tos vispirms neielādējot XMLType objektos). Pirmajā nodaļā izveidoju XML failu progr.xml. To izmantošu šīs datu izguves metodes parādīšanai. XML fails:

<?xml version="1.0"?><PROGRAMMAS>

<PROGRAMMA><IDENT_NUMURS>1</IDENT_NUMURS><NOSAUKUMS>Hemingvejs</NOSAUKUMS><KLASIFIKACIJA>Draiveris</KLASIFIKACIJA>

</PROGRAMMA><PROGRAMMA>

<IDENT_NUMURS>2</IDENT_NUMURS><NOSAUKUMS>Ziedu kareivis</NOSAUKUMS><KLASIFIKACIJA>Operetajsistema</KLASIFIKACIJA>

</PROGRAMMA></PROGRAMMAS>

Šajā metodē jāizveido procedūra, kas izgūst datus no datu bāzes un tabula, kurā dati tiks glabāti.

create table PROGRAMMAS(Ident_numurs number,nosaukums varchar2(40),klasifikacija varchar2(40));

44

create or replacePROCEDURE XML_IELADES_PIEMERS (KAT IN VARCHAR2, FAILS IN VARCHAR2)ASIEL_FAILS BFILE := BFILENAME (KAT, FAILS);CLOB_IEL CLOB;Izvade Dbms_Xmlstore.Ctxtype;Ieraksti NUMBER;

BEGINDbms_Lob.Createtemporary (CLOB_IEL, True);DBMS_LOB.FILEOPEN (IEL_FAILS, DBMS_LOB.FILE_READONLY);DBMS_LOB.LOADFROMFILE (CLOB_IEL, IEL_FAILS, DBMS_LOB.GETLENGTH(IEL_FAILS));DBMS_LOB.FILECLOSE(IEL_FAILS);

Izvade:=DBMS_XMLSTORE.NEWCONTEXT('PROGRAMMAS');Dbms_Xmlstore.Clearupdatecolumnlist(Izvade);

DBMS_XMLGEN.SETROWSETTAG(Izvade, 'PROGRAMMAS');DBMS_XMLSTORE.SETROWTAG(Izvade, 'PROGRAMMA');DBMS_XMLSTORE.SETUPDATECOLUMN (Izvade,'IDENT_NUMURS');DBMS_XMLSTORE.SETUPDATECOLUMN (Izvade,'NOSAUKUMS');DBMS_XMLSTORE.SETUPDATECOLUMN (Izvade,'KLASIFIKACIJA');

Ieraksti:=DBMS_XMLSTORE.INSERTXML(Izvade,CLOB_IEL);Dbms_Xmlstore.Closecontext(Izvade);

END;

Tagad procedūru izpildīšu:

DECLARE KAT VARCHAR2(200); FAILS VARCHAR2(200);BEGIN KAT := 'XMLDIR'; FAILS := 'progr.xml';

XML_IELADES_PIEMERS( KAT => KAT, FAILS => FAILS

45

);END;

Izveidotajā PROGRAMMAS tabulā esošie dati:

Tātad šī metode strādā. Strādājot ar šo metodi jāatceras, ka XML faila objektiem jābūt tādai pašai tagu struktūrai kā tabulas atribūtiem, lai tos varētu izgūt.

46

11.  Relāciju datu izvadīšana XML datu veidā

Lai veiktu relāciju datu izvadīšanu XML datu veidā, arī var lietot vairākas metodes. Sākšu ar vienkāršo XMLELEMENT un XMLATTRIBUTES funkciju metodi.Metodes izpildei izmantošu pagājušajā uzdevumā izveidoto PROGRAMMAS tabulu. Tās saturs:

Vaicājums, lai izgūtu šos datus XML datu veidā:

SELECT XMLELEMENT ("PROGRAMMAS", XMLELEMENT("PROGRAMMA",

XMLATTRIBUTES(IDENT_NUMURS AS "IDENT_NUMURS"),XMLELEMENT ("NOSAUKUMS", NOSAUKUMS),XMLELEMENT ("KLASIFIKACIJA", KLASIFIKACIJA))) AS result from PROGRAMMAS;

Iegūtie dati:

Apskatīšu vienu ierakstu pilnībā to ievietojot NotePad++ rīkā.

<PROGRAMMAS> <PROGRAMMA IDENT_NUMURS="2"> <NOSAUKUMS>Ziedu kareivis</NOSAUKUMS> <KLASIFIKACIJA>Operetajsistema</KLASIFIKACIJA> </PROGRAMMA></PROGRAMMAS>

Kā redzams, izveidotais XML datu fails ir pēc struktūras līdzīgs datubāzē relāciju tabulā ielasītajam XML failam, bet apraksta tikai vienu programmu (jo ir balstīts uz vienu tabulas rindu) un nesatur XML failam nepieciešamu galveni.

47

Otrā metode XMLSEQUENCE ir vieglāk definējama, bet dod mazāku kontroli pār to, kā izskatīsies izvadītie dati XML datu formātā. Izmantošu to pašu tabulu.

SELECT XMLSEQUENCE (CURSOR (SELECT * FROM PROGRAMMAS)) AS XML_IZVADE FROM DUAL;

Izvadītie dati:

Šīs metodes priekšrocība ir tā, ka abi ieraksti tiek apvienoti izvadā (nav divi atšķirīgi objekti) un to ir viegli definēt (lai apskatītu pilnīgi citu tabulu vajadzētu SELECT * FROM PROGRAMMAS daļā nomainīt tabulas nosaukumu PROGRAMMAS uz kādu citu).Trūkums ir tāds, ka, piemēram, pagājušajā metodē mēs varējām veidot pilnvērtīgu tagu konstrukciju, bet šeit visi dati katrai tabulas rindai tiek izvadīti iekš noklusējuma ROW iezīmes.

Nākošā metode pēc struktūras ir vissarežģītākā, bet tajā var definēt tagu konstrukciju un tā apvienos relāciju tabulā esošos ierakstus vienā XML datu kopā. Šī metode balstās uz XML_GEN lietojuma izmantošanu XML faila ģenerēšanai. Tā ir ļoti līdzīga pagājušās nodaļas pēdējai metodei, bet, protams, dara pretējo. Šoreiz netiks definēta procedūra.

48

set serveroutput on;DECLAREIzvade DBMS_XMLGEN.ctxhandle;XML_DATI CLOB;

BEGINIzvade := Dbms_Xmlgen.Newcontext('select * from PROGRAMMAS');DBMS_XMLGEN.SETROWSETTAG (Izvade, 'PROGRAMMAS');DBMS_XMLGEN.setrowtag (Izvade, 'PROGRAMMA');

XML_DATI:=DBMS_XMLGEN.getXML(Izvade);DBMS_OUTPUT.PUT_LINE (XML_DATI);Dbms_Xmlgen.Closecontext(Izvade);END;

Izveidotais XML fails:

<?xml version="1.0"?><PROGRAMMAS> <PROGRAMMA> <IDENT_NUMURS>1</IDENT_NUMURS> <NOSAUKUMS>Hemingvejs</NOSAUKUMS> <KLASIFIKACIJA>Draiveris</KLASIFIKACIJA> </PROGRAMMA> <PROGRAMMA> <IDENT_NUMURS>2</IDENT_NUMURS> <NOSAUKUMS>Ziedu kareivis</NOSAUKUMS> <KLASIFIKACIJA>Operetajsistema</KLASIFIKACIJA> </PROGRAMMA></PROGRAMMAS>

Tas ir identisks XML failam, kura datus ievadīja PROGRAMMAS tabulā.

49

12. Secinājumi

1) Šī praktiskā darba izveides gaitā apguvu trīs XML datu ievades veidus (SQL*Loader izmantošana, bfilename funkcijas pielietošana XML datu ielādei no lietotāja atmiņas kādā noteiktā katalogā esoša XML faila, INSERT INTO komandā vienkārša XML datu veidā rakstīta objekta ievade).

2) Tālāk apguvu vaicājumu veidošanu datu izvadei no XMLType tipu objektu konstrukcijām, kur varēja lietot SQL vaicājumus ( ļoti vienkāršām darbībām ar katru ierakstu, piemēram, noteikta taga vērtības izvade katram XMLType tipa objektam), PL/SQL vaicājumus, kas ļāva nedaudz paplašinātāku datu apstrādi katram objektam, un Xquery vaicājumus, kas strādā XML vidē ar XML struktūrām un, līdz ar to, šie vaicājumi, manuprāt, var sniegt visvairāk datu izguves iespēju.

3) Apguvu arī shēmas izveidi un XMLType tipa objektu konstrukciju veidošanu gan strukturētai XML datu glabāšanai, gan nestrukturētai XML datu glabāšanai, kur strukturētā glabāšanā XML datu ievades fails tiek pārbaudīts un pēc tam, ja dati atbilst shēmā norādītajiem ierobežojumiem un struktūrai tajā esošie dati tiek pievienoti kopējai XMLType tipa objektu konstrukcijai, bet nestrukturētā glabāšanā shēma norāda tikai ierobežojumus, piemēram, ja shēmā norādīts kāds tags, kuram jābūt vismaz vienam meitas mezglam, tad tiks pārbaudīts, vai šis meitas mezgls vispār eksistē ievadītajā XML failā un, ja tā ir, tiks pārbaudīts vai eksistē obligātais meitas mezgls. Ja tas neeksistē, tad un tikai tad tiks izvadīta kļūda par faila neatbilstību piesaistītajai shēmai.

4) Bez tam vēl apguvu divas metodes XML glabājamo datu izvadīšanai relāciju datu veidā un trīs metodes relāciju datu izvadīšanai XML datu veidā. XML glabājamo datu izvadīšanai relāciju datu veidā apguvu vienu metodi, kas izvada XML datus no datu bāzē definētas XMLType tipa objektu konstrukcijas un pārveido tos relāciju formā, un otru metodi, kas ļauj izgūt datus no lietotāja datora atmiņā glabātiem XML failiem. Relāciju datu izvadīšanai XML datu veidā apguvu trīs metodes, kur, manuprāt, vislabākā bija trešā metode, jo tās rezultātā tika izveidots tāds uz relāciju tabulu atribūtiem balstīts XML fails, kuru, izgūstot no datu bāzes, varētu pilnvērtīgi lietot bez rediģēšanas (tam ir galvene un nepieciešamā tagu struktūra).

5) Šis ir vislielākais praktiskais darbs, kur līdz šim esmu veidojis datu bāzes priekšmetā (gan otrajā kursā, gan trešajā). Darbā bija jāizpēta daudz dažādi mehānismi un, manuprāt, man to izdevās izdarīt veiksmīgi. Protams, bija nelielas problēmas, kuras radās praktiskā darba izveides laikā, bet kopumā šis darbs aizņēma par dienu mazāk laika kā iepriekšējais Java darbs, lai gan tā izmērs vismaz pēc lappušu skaita bija mazāks.

50

6) Pirmā problēma bija tā, ka darbu vienkārši nevarēja izpildīt RTU datu bāzē. Tas nebija iespējams, jo es nevarēju definēt kataloga mainīgo, kas ļautu veikt jebkādu bfilename funkcijas pielietojumu. Bez tā man nebūtu nekādas iespējas veikt XML failu vai shēmu datu ievadi datu bāzē. Problēm atrisināju lejupielādējot Oracle Express, tad komandu līnijā cmd izsaucot dbca jeb Database Creation Assistant rīku, kas ļāva man izveidot jaunu datu bāzi.

7) Otrā problēma bija tā, ka man uz datora ir uzinstalēts Oracle 10g R2 datu bāzu lietojums, bet, lai varētu veikt XMLType tipa objektu konstrukcijas izveidi ar bināru glabāšanu, vajag Oracle 11g lietojumu, bet man bija iemesls savu lietojumu neatjaunot un, līdz ar to, šo glabāšanas veidu neparādīju, tikai tā izveidi aprakstīju.

8) Vēl, protams, bija daudzas mazas problēmas, kur vaicājumos bija kādas mazas nepilnības un bija jāpavada laiks meklējot mazas kļūdas, bet tas notiek katrā praktiskajā darbā un par tām dziļi rakstīt secinājumos nav lielas jēgas.

51

13. Lietotā literatūra

Lekciju materiāli no datubāze.wordpress.com.

Datubaze.wordpress.com izvietotais Artūra Feoklistova darba piemērs.

DBCA dokumentācija datu bāzes izveidei

52