Rīgas Tehniskā universitāte
Datorzinātnes un informācijas tehnoloģijas fakultāte
Lietišķo datorsistēmu institūts
3. laboratorijas darbs priekšmetā
Lielās datubāzes
Deduktīvā datubāze
Darba autors: Armands Šlihte
Kurss, grupa: I DMD0-1
Studenta apl.nr.: 051RDB197
Pārbaudīja: prof. J. Eiduks
Rīga 2008
Laboratorijas darba uzdevums
1. Hierarhiska uzdevuma definēšana;
2. Faktu definēšana;
3. Likumu definēšana;
4. Piemērs uz papīra;
5. Likumu glabāšana un izgūšana;
6. Loģiskā izveduma realizēšana (dinamiskais SQL un PL/SQL);
7. Piemēri (vismaz 2);
8. Secinājumi.
Saturs
Ievads.......................................................................................................................................4
1. Hierarhiska uzdevuma definēšana....................................................................................5
2. Faktu definēšana.............................................................................................................10
3. Likumu definēšana..........................................................................................................12
4. Uzdevumu risinājuma piemēri........................................................................................14
4.1. Kas ir kāda darbinieka struktūrvienības kolēģi?.........................................................14
4.2. Kas ir kādas struktūrvienības tiešā virs-struktūrvienība?...........................................16
4.3. Kas ir kāda darbinieka priekšnieki? (Rekursija)..........................................................20
5. Likumu glabāšana un izgūšana........................................................................................23
5.1. Tabulu izveidošana.....................................................................................................23
5.2. Datu ievade................................................................................................................25
5.3. Skatu izveidošana.......................................................................................................28
6. Loģiskā izveduma realizēšana.........................................................................................34
6.1. Kas ir kāda darbinieka kolēģis?..................................................................................34
6.2. Kas ir kādas struktūrvienības tiešā virs-struktūrvienība?...........................................37
6.3. Kas ir kāda darbinieka priekšnieki? (Rekursija)..........................................................42
7. Piemēri............................................................................................................................44
Ievads
Šajā laboratorijas darbā tiks veidota deduktīva datubāze. Līdzīgi kā citos darbos viens
no svarīgākajiem uzdevumiem ir izdomāt priekšmetisko vidi, tā lai būtu iespējams izpildīt
visus uzdotos norādījumus. Jādefinē hierarhisks uzdevums. Es izvēlējos par priekšmetisko
vidi uzņēmumu ar 2 hierarhiskām datu struktūrām – darbiniekiem un struktūrvienībām.
Darbinieku hierarhija izpaužas darbiniekus iedalot priekšniekos un padotajos.
Struktūrvienību hierarhija izpaužas tās iedalot virs struktūrvienībās un apakš
struktūrvienībās.
Vispirms tiks definēts hierarhisks uzdevums, tad tiks definēti fakti, tad tiks definēti
likumi, tad tiks izveidots uzdevuma risināšanas piemērs „uz papīra”, tad tiks definētas likumu
glabāšanas un izgūšanas struktūras, tad tik realizēts loģiskais izvedums, visbeidzot tiks
realizēti vairāki piemēri un izdarīti secinājumi.
4
1. Hierarhiska uzdevuma definēšana
Pirmais uzdevumus ir hierarhiska uzdevuma definēšana. Šajā darbā izvēlējos par
priekšmetisko vidi izmantot uzņēmumu ar 2 hierarhiskām datu struktūrām – darbinieki un
struktūrvienības. Starp darbiniekiem var būt attiecības priekšnieks un padotais, bet starp
struktūrvienībām virs-struktūrvienība un apakš-struktūrvienība. Papildus tam
struktūrvienības tiks sasaistītas ar darbiniekiem izmantojot struktūrvienību amatus, kurus
darbinieki ieņem.
Vispirms grafiski definēsim hierarhiskās struktūras. Struktūrvienību savstarpējās
attiecības jeb hierarhiju parāda Attēls 1.1, struktūrvienību identifikatorus atšifrējumus
parāda Tabula 1. Informācijas tehnoloģijas dienests ir virs-struktūrvienība visām
struktūrvienībām. Kopā ir 3 līmeņi.
Attēls 1.1 Struktūrvienību hierarhija
Darbinieku savstarpējās attiecības - priekšniekus un padotos attēlo Attēls 1.2.
Guntars ir vislielākais priekšnieks, jo viņš ir Informācijas tehnoloģijas dienesta vadītājs. Kopā
darbiniekiem arī ir 3 līmeņi atbilstoši struktūrvienībām. Šī darbinieku hierarhijas shēma tiks
ņemta par pamatu pārējiem šī darba uzdevumiem, kur būs nepieciešami dati.
5
Tiks izmantota relāciju datubāze ar 3 tabulām Struktūrvienības(Struktūrvienības
kods, struktūrvienība), Priekšnieki(priekšnieks, padotais) un Darbinieki(vārds,
struktūrvienība, amats). Struktūrvienību attiecības jeb virs-struktūras un apakš-struktūras
būs iespējams noteikt pēc struktūrvienību vadītāju hierarhijas.
Tabula 1 parāda struktūrvienības un to identifikatorus.
Tabula 1 Struktūrvienības
Struktūrvienības
identifikators
(STR_ID)
Struktūrvienība (STR_NOS)
ITD Informācijas tehnoloģijas dienests
IS Informācijas sistēmu nodaļa
ITSA Informācijas tehnoloģijas stratēģiskās attīstības
nodaļa
DTP Datortehnikas un tīkla pakalpojumu nodaļa
LAC Lietotāju atbalsta centrs
ISIG Informācijas sistēmu izstrādes grupa
ISUG Informācijas sistēmu uzturēšanas grupa
PAG Programmatūras apkalpes grupa
DAG Datortehnikas apkalpes grupa
KAG Klientu apkalpošanas grupa
Tabula 2 parāda darbiniekus – vārds, struktūrvienība, kurā strādā un amats, kuru
struktūrvienībā ieņem. Personām tiek piesaistīti konkrēti amati konkrētā struktūrvienībās.
Katrai struktūrvienībai ir vadītājs, kas atbildīgs par struktūrvienības darbu un ir priekšnieks
šīs struktūrvienības darbiniekiem ar citiem amatiem. Piemēram, Imants ir Informācijas
sistēmu nodaļas vadītājs.
Tabula 2 Darbinieki
Vārds (D_VARDS) Struktūrvienība (D_STR) Amats (D_AMATS)
Guntars ITD Vadītājs
7
Imants IS Vadītājs
Gatis ITSA Vadītājs
Ģirts DTP Vadītājs
Kaspars LAC Vadītājs
Armands ISIG Vadītājs
Aleksandrs ISUG Vadītājs
Rolands DAG Vadītājs
Sergejs PAG Vadītājs
Linda KAG Vadītājs
Mārtiņš ISIG Programmētājs
Dainis ISIG Programmētājs
Raitis ISUG IT projektu vadītājs
Miķelis ITSA IT projektu vadītājs
Ludmila ITSA Sistēmu analītiķis
Kārlis DTP Administrators
Jānis DTP Administrators
Raimonds DAG Administrators
Lidija DAG Administrators
Uldis PAG Administrators
Sandra KAG Speciālists
Līga KAG Speciālists
Tabula 3 parāda darbinieku savstarpējās attiecības – priekšniekus un padotos. Pēc šīs
tabulas būs iespējams arī izvest struktūrvienību hierarhiju, jo kādas apakš-struktūrvienības
vadītājs ir padotais kādai virs-struktūrvienībai. Piemēram, Guntars, kurš ir vadītās
Informācijas Tehnoloģijas dienestam ir priekšnieks Imantam, kurš ir Informācijas Sistēmu
nodaļas vadītājs. Tas nozīmē, ka Informācijas Tehnoloģijas dienests ir virs-struktūrvienība
Informācijas Sistēmu nodaļai.
Tabula 3 Priekšnieki
Priekšnieks (PRIEKSNIEKS) Padotais (PADOTAIS)
8
Guntars Imants
Guntars Gatis
Guntars Ģirts
Guntars Kaspars
Imants Armands
Imants Aleksandrs
Gatis Miķelis
Gatis Ludmila
Ģirts Kārlis
Ģirts Jānis
Kaspars Rolands
Kaspars Sergejs
Kaspars Linda
Armands Mārtiņš
Armands Dainis
Aleksandrs Raitis
Rolands Raimonds
Rolands Lidija
Sergejs Uldis
Linda Sandra
Linda Līga
9
2. Faktu definēšana
Definētajā uzdevumā iespējams izdalīt datus, faktus un likumus. Dati šeit būtu kādi
noteikti informācijas vienumi, piemēram:
Darbinieka vārds ir Armands, darbinieka_vārds(Armands);
Ir darbinieka amats Vadītājs, amats(Vadītājs);
Ir struktūrvienība ITD struktūrvienība (ITD) ;
Priekšnieka vārds ir Guntars, priekšnieka_vārds(Guntars);
Padotā vārds ir Imants, padotā_vārds(Imants);
...
Fakti veidojas, kad tiek izveidota attiecība starp šiem datiem, piemēram:
Informācijas tehnoloģijas dienests ir struktūrvienība ar identifikatoru ITD,
struktūrvienība(ITD, Informācijas Tehnoloģijas dienests);
Guntars ir darbinieks, kas strādā ITD par vadītāju, darbinieks(Guntars, ITD,
Vadītājs);
Guntars ir Imanta priekšnieks, priekšnieks(Guntars, Imants);
...
Tātad šim uzdevumam, jādefinē šādi fakti (skat. Tabula 4). Fakti tiek definēti ar
predikātiem.
Tabula 4 Fakti
Predikāti Fakti
struktūrvienība(X, Y) struktūrvienība(X, ITD)
struktūrvienība(X, IS)
struktūrvienība(X, ITSA)
struktūrvienība(X, DTP)
struktūrvienība(X, LAC)
struktūrvienība(X, ISIG)
struktūrvienība(X, ISUG)
struktūrvienība(X, PAG)
struktūrvienība(X, DAG)
struktūrvienība(X, KAG)
10
amats(X, Y) amats(X, Vadītājs)
amats(X, IT projektu vadītājs)
amats(X, Sistēmu analītiķis)
amats(X, Administrators)
amats(X, Programmētājs)
amats(X, Speciālists)
tiešais_priekšnieks(X, Y) tiešais_priekšnieks(Guntars, Imants)
tiešais_priekšnieks(Guntars, Gatis)
tiešais_priekšnieks(Guntars, Ģirts)
tiešais_priekšnieks(Guntars, Kaspars)
tiešais_priekšnieks(Imants, Armands)
tiešais_priekšnieks(Imants, Aleksandrs)
tiešais_priekšnieks(Gatis, Miķelis)
tiešais_priekšnieks(Gatis, Ludmila)
tiešais_priekšnieks(Ģirts, Kārlis)
tiešais_priekšnieks(Ģirts, Jānis)
tiešais_priekšnieks(Kaspars, Rolands)
tiešais_priekšnieks(Kaspars, Sergejs)
tiešais_priekšnieks(Kaspars, Linda)
tiešais_priekšnieks(Armands, Mārtiņš)
tiešais_priekšnieks(Armands, Dainis)
tiešais_priekšnieks(Aleksandrs, Raitis)
tiešais_priekšnieks(Rolands, Raimonds)
tiešais_priekšnieks(Rolands, Lidija)
tiešais_priekšnieks(Sergejs, Uldis)
tiešais_priekšnieks(Linda, Sandra)
tiešais_priekšnieks(Linda, Līga)
11
3. Likumu definēšana
Likumu var izteikt ar teikumu, kas savukārt sastāv no predikātiem un faktiem.
Definētajam uzdevumam var izdalīt šādu likumus:
struktūrvienība(darbinieka_vārds, struktūrvienības_id) jeb struktūrvienība(X,
Y);
amats(darbinieka_vārds, amats) jeb amats(X,Y);
tiešais_priekšnieks(tiešā_priekšnieka_vārds, tiešā_padotā_vārds) jeb
tiešais_priekšnieks(X, Y);
...
Darbiniekam ar vārdu X ir kolēģis darbinieks ar vārdu Y, abiem darbiniekiem jāstrādā
vienā struktūrvienībā. Definētajam uzdevumam var izdalīt šādus saliktus likumus:
tiešā_virsstruktūra(struktūrvienības_id1, struktūrvienības_id2) :-
struktūrvienība(X, struktūrvienības_id1), amats(X, Vadītājs),
struktūrvienība(Y, struktūrvienības_id2), amats(Y, Vadītājs),
tiešais_priekšnieks(X, Y);
kolēģis(X, Y) :- struktūrvienība(X, struktūrvienības_id), struktūrvienība(Y,
struktūrvienības_id);
Darbiniekam ar vārdu X priekšnieks ir darbinieks ar vārdu Y. Tas nav tas pats, kas
tiešais priekšnieks, jo darbinieka priekšnieka priekšnieks arī ir šī darbinieka priekšnieks.
Veidojas rekursīvs likums. Līdzīgi ir ar struktūrvienībām. Virs-struktūrvienība kādai
struktūrvienībai ir šīs arī struktūrvienības apakš-struktūrvienības virs-struktūrvienība.
Definētajam uzdevumam var izdalīt šādus rekursīvus likumus:
priekšnieks(X, Y) :- tiešais_priekšnieks(X, Y);
priekšnieks(X, Y) :- priekšnieks(X, darbinieka_vārds),
tiešais_priekšnieks(darbinieka_vārds, Y);
virsstruktūra(X, Y) :- struktūrvienība(darbinieka_vārds1,Y),
amats(darbinieka_vārds1, Vadītājs), struktūrvienība(darbinieka_vārds2, X),
amats(darbinieka_vārds2, Vadītājs), priekšnieks(X, Y);
12
Šim uzdevumam definēsim šādus likumus (Skat. Tabula 5 Likumi).
Tabula 5 Likumi
Likums Teikums
tiešā_virsstruktūra(V, A) struktūrvienība(X, V), amats(X, Vadītājs), struktūrvienība(Y,
A), amats(Y, Vadītājs), tiešais_priekšnieks(X, Y)
kolēģis(D, X) struktūrvienība(D, Y), struktūrvienība(X, Y)
priekšnieks(D, X) priekšnieks(D, Y), tiešais_priekšnieks(Y, X)
virsstruktūra(V, A) struktūrvienība(X, V), amats(X, Vadītājs), struktūrvienība(Y,
A), amats(Y, Vadītājs), priekšnieks(X, Y)
13
4. Uzdevumu risinājuma piemēri
4.1. Kas ir kāda darbinieka struktūrvienības kolēģi?
Tiek uzdots uzdevums atrast Armanda kolēģus (Skat. Attēls 4.3). Kā būs redzams
turpmāk rezultātā tiek atrasti visi darbinieki, kas strādā Armanda struktūrvienībā jeb
Armanda kolēģi. Vispirms tiek atlasītas visas struktūrvienības un Armanda struktūrvienība.
Tad pēc Armanda struktūrvienības visi šīs struktūrvienības darbinieki –Armands, Mārtiņš un
Dainis. Šeit nepilnība ir tā, ka rezultātā tiek iekļauts arī pats Armands. Šo nepilnību varētu
izlabot, pievienojot kolēģa likumam nosacījumu NOT un attiecināt to uz X. Taču tas ļoti
nopietni sarežģītu deduktīvas datubāzes realizēšanu. Pagaidām samierināsimies ar šādu
rezultātu. Uzdevuma risinājums parādīts turpmākajos attēlos.
Attēls 4.3 Uzdevums
14
Likumu un faktu predikātu pakārtotības koks (Skat. Attēls 4.4). Šim uzdevumam koku
veido tikai fakti – struktūrvienība(D, Y) un struktūrvienība(Armands, Y).
Attēls 4.4 Likumu un faktu predikātu pakārtotības koks
Koka lapu faktu predikāti (Skat. Attēls 4.5).
Attēls 4.5 Koka lapu faktu predikāti
Faktu predikātu savienošana (Skat. Attēls 4.6).
Attēls 4.6 Faktu predikātu savienošana
15
Rezultātā tiek iegūts, ka Armanda struktūrvienības darbinieki jeb kolēģi ir Armands,
Mārtiņš un Dainis.
4.2. Kas ir kādas struktūrvienības tiešā virs-struktūrvienība?
Sarežģītāks uzdevums ir atrast struktūrvienības ISIG tiešo virs-struktūrvienību (Skat.
Attēls 4.7). Pirmkārt, tiek atlasītas visu struktūrvienību darbinieki un visi vadītāji, lai
noskaidrotu visus struktūrvienību vadītājus. Otrkārt, tiek atlasīti visi ISIG struktūrvienības
darbinieki un noskaidrots tās vadītājs. Tad tiek atlasīti visi tiešie priekšnieki un tiešie padotie,
lai būtu iespējams salīdzināt, kurš ir ISIG struktūrvienības vadītāja priekšnieks. Un tad pēc šī
priekšnieka vārda var noskaidrot, kurai struktūrvienībai tas ir vadītājs. Šī struktūrvienība arī
būs ISIG struktūrvienības virs-struktūrvienība. Uzdevuma risinājums redzams turpmākajos
attēlos.
16
Attēls 4.8 Likumu un faktu predikātu pakārtotības koks
Koka lapu faktu predikāti (Skat. Attēls 4.9).
Attēls 4.9 Koka lapu faktu predikāti
18
Faktu predikātu savienošana (Skat. Attēls 4.10).
Attēls 4.10 Faktu predikātu savienošana
Tātad vispirms tiek secināts, ka ISIG struktūrvienības vadītājs ir Armands, tad atrasts
darbinieka vārds, kurš ir Armanda tiešais priekšnieks. Visbeidzot tiek noskaidrots šī tiešā
19
priekšnieka struktūrvienība. Rezultātā iegūstam, ka ISIG struktūrvienības tiešā virs-
struktūrvienība ir IS jeb Informācijas Sistēmu nodaļa.
4.3. Kas ir kāda darbinieka priekšnieki? (Rekursija)
Vēl sarežģītāks uzdevums ir noskaidrot – kas ir kāda darbinieka priekšnieki? Tātad
kas ir Armanda priekšnieki. Šeit priekšnieki ir gan Armanda tiešais priekšnieks, gan Armanda
tiešā priekšnieka tiešais priekšnieks utt. Veidojas rekursija. Tiks izmantots iepriekš definētais
likums priekšnieks. Uzdevumu parāda Attēls 4.11.
Attēls 4.11 Uzdevums
20
Likumu un faktu predikātu pakārtotības koks ar rekursiju (Skat. Attēls 4.12Attēls 4.8).
Attēls 4.12 Likumu un faktu predikātu pakārtotības koks ar rekursiju
Koka lapu faktu predikāti ar rekursiju (Skat. Attēls 4.12Attēls 4.9).
Attēls 4.13 Koka lapu faktu predikāti ar rekursiju
21
Faktu predikātu savienošana (Skat. Attēls 4.10). Kā redzams pēdējā savienojumā nav
rezultātu tādēļ savienošana apstājās. Tas veidojas dēļ rekursijas.
Attēls 4.14 Faktu predikātu savienošana
Tātad vispirms tiek secināts, ka Armanda tiešais priekšnieks ir Imants, tad ka Imanta
tiešais priekšnieks ir Guntars. Tas nozīmē, ka Armanda priekšnieks ir gan Imants, gan
Guntars.
22
5. Likumu glabāšana un izgūšana
5.1. Tabulu izveidošana
Kā tika minēts iepriekš, likumu glabāšanai tiks izmantota relāciju datu bāze ar 3
tabulām STRUKTURVIENIBAS, DARBINIEKI un TIESIE_PRIEKSNIEKI. Struktūrvienību
identifikatori un nosaukumi glabāsies tabulā STRUKTURVIENIBAS (skat. Attēls 5.15).
Attēls 5.15 Tabulas STRUKTURVIENIBAS izveidošana
Organizācijas darbinieku dati glabāsies tabulā DARBINIEKI (skat. Attēls 5.16). Tajā
glabāsies darbinieka vārds, struktūrvienības identifikators, kurā tas strādā un ieņemamais
amats.
Attēls 5.16 Tabulas DARBINIEKI izveidošana
23
Darbinieku savstarpējās attiecības jeb tiešie priekšnieki un tiešie padotie glabāsies
tabulā TIESIE_PRIEKSNIEKI (skat. Attēls 5.17). Tiks glabāts tiešā priekšnieka identifikators
pretī tiešā padotā identifikatoram.
Attēls 5.17 Tabulas TIESIE_PRIEKSNIEKI izveidošana
24
5.2. Datu ievade
Tagad izveidotajās tabulās tiks ievadīti dati. Struktūrvienību informācija tiek ievadīta
tabulā STRUKTURVIENIBAS (skat. Attēls 5.18). Attēls 5.19 parāda tabulas satura pārbaudi.
Attēls 5.18 Datu ievade tabulā STRUKTURVIENIBAS
25
Attēls 5.19 Tabulas STRUKTURVIENIBAS saturs
Darbinieku informācija tiek ievadīta tabulā DARBINIEKI (skat. Attēls 5.20).
Attēls 5.20 Datu ievade tabulā DARBINIEKI
26
Attēls 5.21 parāda tabulas DARBINIEKI satura pārbaudi.
Attēls 5.21 Datu pārbaude tabulai DARBINIEKI
Tiešie priekšnieki un tiešie padotie tiek ievadīti tabulā TIESIE_PRIEKSNIEKI (skat.
Attēls 5.22)
27
Attēls 5.22 Datu ievade tabulā TIESIE_PRIEKSNIEKI
5.3. Skatu izveidošana
Uzdevuma realizēšanai definētajiem faktiem tiks izveidoti skati
TIESAIS_PRIEKSNIEKS, TIESA_STRUKTURVIENIBA, AMATS. Faktus par tiešajiem priekšniekiem
parādīs skats TIESAIS_PRIEKSNIEKS (skat. Attēls 5.23). Attēls 5.24 parāda skata darbības
pārbaudi.
28
Attēls 5.23 Skata TIESAIS_PRIEKSNIEKS izveidošana
Attēls 5.24 Skata TIESAIS_PRIEKSNIEKS darbības pārbaude
29
Faktus par darbinieku tiešajām struktūrvienībām parādīs skats
TIESA_STRUKTURVIENIBA (skat. Attēls 5.25). Attēls 5.26 parāda skata darbības pārbaudi.
Attēls 5.25 Skata TIESA_STRUKTURVIENIBA izveidošana
Attēls 5.26 Skata TIESA_STRUKTURVIENIBA darbības pārbaude
30
Faktus par darbinieka amatiem parādīs skats AMATS (skat. Attēls 5.27).
Attēls 5.28 parāda skata darbības pārbaudi.
Attēls 5.27 Skata AMATS izveidošana
Attēls 5.28 Skata AMATS darbības pārbaude
31
Iespējams arī izveidot skatu FAKTI, kas parādītu visus faktus (skat. Attēls 5.29). Attēls
5.30 un Attēls 5.31 parāda visus faktus.
Attēls 5.29 Skata FAKTI izveidošana
Attēls 5.30 Skata FAKTI darbības pārbaude 1
32
6. Loģiskā izveduma realizēšana
Iepriekšējās nodaļās tika definēti 2 uzdevumi: Armanda kolēģu iegūšana un ISIG
struktūrvienības tiešā virs-struktūrvienības iegūšana. Šajā nodaļā tiks realizēta šo uzdevumu
loģiskie izvedumi.
6.1. Kas ir kāda darbinieka kolēģis?
1. uzdevums ir šāds: Kas ir Armanda kolēģis? Tabula 6 parāda šī uzdevuma
vaicājumu. Tabula 7 parāda likumu definējumu tabulu. Attēls 6.32 parāda izveduma koka
faktu predikātu savienošanu. Kā redzams šis uzdevums ir diezgan vienkāršs.
Tabula 6 Vaicājums
Predikāts 1. atribūts 2. atribūts
kolēģis D Armands
Tabula 7 Likumu definējumu tabula
Likuma
nr.
Sastāv-
daļas
nr.
Likums
vai
fakts
Predikāts – likums Pakārtotie predikāti 1.
atribūts
2.
atribūts
1 0 L kolēģis D X
1 1 F tiešā_struktūrvienība D Y
1 2 F tiešā_struktūrvienība X Y
Attēls 6.32 Izveduma koka faktu predikātu savienošana
34
Šī uzdevuma faktu predikātu savienojumu realizējošie SELECT vaicājumi (skat. Attēls
6.33). Šim uzdevumam pietiek ar vienu vaicājumu.
Attēls 6.33 Faktu predikātu savienojumu realizējošie SELECT vaicājumi
Tagad realizēsim šo uzdevumu ar dinamisko SQL. Šeit papildus grūtības sagādā tas,
ka kolēģi var būt vairāki un jāizmanto kursors, lai atgrieztu vairākus kolēģus. Šo realizāciju
parāda Attēls 6.34.
Attēls 6.34 Dinamiskais SQL
35
Attēls 6.35 Dinamiskā SQL realizēšana
Kā redzams attēlā meklējot Armanda struktūrvienības kolēģus tiek atrasti fakti:
kolēģis(Armands, ISIG), kolēģis(Mārtiņš, ISIG), kolēģis(Dainis, ISIG). Tātad kolēģi ir Armands,
Mārtiņš un Dainis.
Tagad šis vaicājums jāpārtaisa par procedūru, lai būtu iespējams iegūt arī citu
darbinieku kolēģus. Procedūras izveidošanu parāda Attēls 6.36. Šī procedūra atgriezīs
darbinieka struktūrvienības kolēģus pēc norādītā darbinieka vārda.
36
Attēls 6.36 Procedūra kolēģu iegūšanai izveidošana
6.2. Kas ir kādas struktūrvienības tiešā virs-struktūrvienība?
2. uzdevums ir šāds: Kas ir ISIG struktūrvienības tiešā struktūrvienība. Tabula 8
Vaicājums parāda definēto vaicājumu ar atribūtiem. Tabula 9 parāda likumu definējumu
tabulu. Tabula 10 parāda izveduma koka tabulu. Kā redzams šis uzdevums jau ir mazliet
sarežģītāks.
Tabula 8 Vaicājums
Predikāts 1. atribūts 2. atribūts
tiešā_virsstruktūra V ISIG
Tabula 9 Likumu definējumu tabula
Likuma
nr.
Sastāv-
daļas
Likums
vai
Predikāts – likums Pakārtotie predikāti 1.
atribūts
2.
atribūts
37
nr. fakts
1 0 L tiešā_virsstruktūra V A
1 1 F tiešā_struktūrvienība X V
1 2 F amats X Vadītājs
1 3 F tiešā_struktūrvienība Y A
1 4 F amats Y Vadītājs
1 5 F tiešais_priekšnieks X Y
Tabula 10 Izveduma koka tabula
Likums vai fakts Predikāts 1. atribūts 2. atribūts
F tiešā_struktūrvienība X V
F amats X Vadītājs
F tiešā_struktūrvienība Y A
F amats Y Vadītājs
F tiešais_priekšnieks X Y
38
Izveduma koka faktu predikātu savienošana (skat. Attēls 6.37).
Attēls 6.37 Izveduma koka faktu predikātu savienošana
Faktu predikātu savienojumu realizējošie SELECT vaicājumi (skat. Attēls 6.38).
Attēls 6.38 Faktu predikātu savienojumu realizējošie SELECT vaicājumi
39
Dinamiskā SQL izmantošana kopējā vaicājuma realizēšanai (skat. Attēls 6.39
Dinamiskais SQL).
Attēls 6.39 Dinamiskais SQL
40
Šī uzdevuma atrisināšanas dinamiskā SQL realizēšanu parāda Attēls 6.40.
Attēls 6.40 Dinamiskā SQL realizēšana
Kā redzams attēlā uzdodot struktūrvienību ISIG iegūstam faktu, ka struktūrvienības
ISIG tiešā virs-struktūrvienība ir IS jeb Informācijas Sistēmu nodaļa. Lai būtu iespējams uzdot
arī citas struktūrvienības izveidosim procedūru. Šīs procedūras izveidošanu parāda .
41
Attēls 6.41 Procedūras tiešās virs-struktūrvienības iegūšanai izveidošana
6.3. Kas ir kāda darbinieka priekšnieki? (Rekursija)
3. uzdevums ir šāds: Kas ir Armanda priekšnieki? Šis uzdevums izmanto rekursīvu
likumu priekšnieks(X, Y). Tādēļ likumu definējumu tabula un koka lapu predikātu tabula
netiks veidota. Iepriekš izveidotās shēmas šo uzdevumu pietiekami definē. Šis uzdevums tiks
risināts ar rekursīvu procedūru. Tas nozīmē, ka procedūra izsauks pati sevi un atkarībā no
nosacījuma izbeigs darbību. Nosacījums šajā gadījumā būs tas, ka tiek sasniegts darbinieks,
kuram nav priekšnieka – visu darbinieku priekšnieks. Procedūras ķermeņa funkcionalitāte
tiks veidota izmantojot dinamisko SQL. Dinamisko SQL vaicājumu parāda Attēls 6.42.
Procedūra meklēs uzdotā padotā pēc darbinieka vārda tiešo priekšnieku. Ja
priekšnieks tiks atrasts tā meklēs šī tiešā priekšnieka tiešo priekšnieku. Tas notiks līdz
42
atrastajam darbiniekam vairs nebūs tiešā priekšnieka. Iestāsies izņēmums EXCEPTION
NO_DATA_FOUND.
Attēls 6.42 Procedūras izveidošana
43
7. Piemēri
Šajā nodaļā tiks praktiski pielietotas iepriekš izveidotās procedūras, lai risinātu
definētos uzdevumus. Vispirms atradīsim darbinieku struktūrvienību kolēģus izmantojot
izveidoto procedūru IEGUT_KOLEGUS. Atradīsim Gata, Rolanda un Lindas struktūrvienību
kolēģus. Nododot procedūrai, ka jāiegūst Gata struktūrvienības kolēģus, tiek noteikti
struktūrvienības ITSA jeb Informācijas Tehnoloģijas Stratēģiskās Attīstības nodaļas kolēģi.
Iegūstam faktus kolēģis(Gatis, ITSA), kolēģis(Miķelis, ITSA) un kolēģis(Ludmila, ITSA). Tātad
ITSA struktūrvienības kolēģi ir Gatis, Miķelis un Ludmila. Procedūras rezultātu parāda Attēls
7.43.
Attēls 7.43 Procedūras rezultāts
Ja jāiegūst Rolanda struktūrvienības kolēģus, tiek noteikti struktūrvienības DAG jeb
Datortehnikas Apkalpes Grupas kolēģi. Iegūstam faktus kolēģis(Rolands, DAG),
kolēģis(Raimons, DAG) un kolēģis(Lidija, DAG). Tātad DAG struktūrvienības kolēģi ir Rolands,
Raimons un Lidija. Procedūras rezultātu parāda Attēls 7.43.
44
Attēls 7.44 Procedūras rezultāts
Nododot procedūrai, ka jāiegūst Lindas struktūrvienības kolēģus, tiek noteikti
struktūrvienības KAG jeb Klientu Apkalpošanas Grupas kolēģi. Iegūstam faktus kolēģis(Linda,
KAG), kolēģis(Sandra, KAG) un kolēģis(Līga, KAG). Tātad KAG struktūrvienības kolēģi ir Linda,
Sandra un Līga. Procedūras rezultātu parāda Attēls 7.43.
Attēls 7.45 Procedūras rezultāts
45
Otrs uzdevums ir noteikt – kas ir kādas noteiktas struktūrvienības tiešā virs-
struktūrvienība. Šo uzdevumu iespējams atrisināt izmantojot iepriekš izveidoto procedūru
IEGUT_TIESO_VIRSSTRUKTURU. Iegūsim tiešās virs-struktūrvienības struktūrvienībām ar
identifikatoriem DTP – Datortehnikas un Tīklu Pakalpojumu nodaļa, PAG – Programmatūras
Apkalpes grupa un ISUG – Informācijas Sistēmu Uzturēšanas grupa. Norādot struktūrvienību
DTP tiek noteikts, ka DTP vadītājs ir Ģirts un Ģirta tiešais priekšnieks ir Guntars, bet Guntars
ir struktūrvienības ITD vadītājs. Tātad ITD jeb Informācijas Tehnoloģijas dienests ir
struktūrvienības ITD tiešā virs-struktūrvienība. Tiek iegūts fakts tiešā_virsstruktūra(ITD, DTP).
Procedūras rezultātu parāda Attēls 7.46.
Attēls 7.46 Procedūras rezultāts
Ja procedūrai uzdod struktūrvienību PAG, vispirms tiek noteikt, ka PAG vadītājs ir
Sergejs, taču Sergeja tiešais priekšnieks ir Kaspars, kurš savukārt ir struktūrvienības LAC
vadītājs. Tātad struktūrvienība LAC jeb Lietotāju Atbalsta centrs ir struktūrvienības PAG tiešā
virs-struktūrvienība. Procedūras izsaukumu un rezultātu parāda Attēls 7.47.
46
Attēls 7.47 Procedūras rezultāts
Uzdodot procedūrai IEGUT_TIESAS_VIRSSTRUKTURAS struktūrvienības identifikatoru
ISUG, vispirms tiek noskaidrots, ka ISUG vadītājs ir Aleksandrs. Tad tiek noskaidrots
Aleksandra tiešais priekšnieks. Tas ir Imants, kas ir IS jeb Informācijas Sistēmu nodaļas
vadītājs. Seko, ka struktūrvienība IS ir tiešā virs-struktūrvienība struktūrvienībai ISUG.
Procedūras izsaukumu un rezultātu parāda Attēls 7.48.
Attēls 7.48 Procedūras rezultāts
Šeit interesanti būtu pārbaudīt – kādu rezultātu dotu procedūra, ja tai padod visu
struktūrvienību virs-struktūrvienību. Šajā gadījumā tā ir ITD – Informācijas Tehnoloģijas
47
dienests. Šai struktūrvienībai nav virs-struktūrvienības, tādēļ procedūrai nevajadzētu neko
atgriezts vai arī atgriezt kļūdu. Izrādās procedūra atgriež kļūdu - 01403. 00000 - "no data
found" - par to, ka dati nav atrasti. Procedūras izsaukumu un rezultātu parāda Attēls 7.49.
Attēls 7.49 Procedūras rezultāts
Trešais uzdevums ir rekursīvs – atrast kāda darbinieka priekšniekus. Šo uzdevumu
iespējams atrisināt izmantojot iepriekš izveidoto procedūru IEGUT_PRIEKSNIEKUS. Iegūsim
priekšniekus Armandam, Lidijai un Līgai. Norādot darbinieka vārdu Armands tiek noteikts, ka
Armanda tiešais priekšnieks ir Imants un Imanta tiešais priekšnieks ir Guntars, bet Guntaram
nav tiešā priekšnieka. Tātad tiek iegūti fakti priekšnieks(Imants, Armands),
priekšnieks(Guntars, Armands). Tas nozīmē, ka Armanda priekšnieki ir Imants un Guntars.
Procedūras rezultātu parāda Attēls 7.50.
48
Attēls 7.50 Procedūras rezultāts
Norādot darbinieka vārdu Lidija tiek noteikts, ka Lidijas tiešais priekšnieks ir Rolands,
Rolanda tiešais priekšnieks ir Kaspars un Kaspara tiešais priekšnieks ir Guntars, bet Guntaram
nav tiešā priekšnieka. Tātad tiek iegūti fakti priekšnieks(Rolands, Lidija), priekšnieks(Kaspars,
Lidija) un priekšnieks(Guntars, Lidija). Tas nozīmē, ka Lidijai priekšnieki ir Rolands, Kaspars un
Guntars. Procedūras rezultātu parāda Attēls 7.51.
Attēls 7.51 Procedūras rezultāts
Norādot darbinieka vārdu Līga tiek noteikts, ka Līgas tiešais priekšnieks ir Linda,
Lindas tiešais priekšnieks ir Kaspars un Kaspara tiešais priekšnieks ir Guntars, bet Guntaram
49
nav tiešā priekšnieka. Tātad tiek iegūti fakti priekšnieks(Linda, Līga), priekšnieks(Kaspars,
Līga) un priekšnieks(Guntars, Līga). Tas nozīmē, ka Līgai priekšnieki ir Linda, Kaspars un
Guntars. Procedūras rezultātu parāda Attēls 7.52Attēls 7.51.
Attēls 7.52 Procedūras rezultāts
50
Secinājumi
Šajā laboratorijas darbā tika veidota deduktīva datubāze un risināti hierarhiski
uzdevumi. Vispirms tika definēts hierarhisks uzdevums. Tika izvēlēts par priekšmetisko vidi
uzņēmums ar 2 hierarhiskām datu struktūrām – darbiniekiem un struktūrvienībām.
Darbinieku hierarhija izpaužas darbiniekus iedalot priekšniekos un padotajos.
Struktūrvienību hierarhija izpaužas tās iedalot virs struktūrvienībās un apakš
struktūrvienībās. Tad tika definēti fakti – darbinieka tiešā struktūrvienība, darbinieka amats,
darbinieka tiešais priekšnieks. Tad tika definēti likumi – tiešā virs-struktūrvienība, kolēģis.
Tika definēti arī 2 rekursīvi likumi priekšnieks un virs-struktūrvienība. Tad tika izveidots 2
uzdevumu risināšanas piemēri „uz papīra” jeb ar tabulu un shēmu palīdzību. Tad tika
definētas likumu glabāšanas un izgūšanas struktūras. Tad tika realizēts loģiskais izvedums
šiem 2 uzdevumiem. Šeit tika pielietots dinamiskā SQL tehnoloģija. Tas nozīmē, ka SQL tiek
veidots dinamiski izmantojot PL/SQL. SQL vaicājums tiek veidots no teksta jeb VARCHAR2
tipa mainīgajiem, kuri var saturēt vai nu vaicājuma sastāvdaļas vai kādas konkrētas vērtības.
Izmantojot dinamisko SQL tika atrisināti uzdoti uzdevumi. Vēlāk šie vaicājumi tika
pārveidoti par procedūrām, lai tops varētu pielietot arī citos gadījumos. Gadījumā, kad
dinamiskais SQL atgriež vairāku rindu vērtības, lai iegūtu visus rezultātus nevar izmantot
EXECUTE IMMEDIATE, bet jāizmanto kursors. Tas veiksmīgi tika arī atrisināts. Tika izveidotas
2 procedūras, kas katra risināja kādu no definētajiem uzdevumiem. Visbeidzot tika realizēti
vairāki piemēri izmantojot šīs procedūras. Procedūras veiksmīgi strādāja. Tika izmēģināts
izņēmuma gadījums, struktūrvienības virs-struktūrvienības iegūšanai. Procedūrai tika nodota
struktūrvienība ITD, kas ir visu struktūrvienību virs-struktūrvienība un tai nav virs-
struktūrvienības. Procedūra atgrieza kļūdu, ka dati netika atrasti, bet „DBMS OUTPUT” neko
neizvadīja. Tas nozīmē, ka arī šajā situācijā procedūra nostrādāja veiksmīgi.
Darbā tika definēti arī rekursīvi likumi un rekursīvs uzdevums atrast kāda darbinieka
priekšniekus. Šī uzdevuma realizēšanai tika izveidota rekursīva procedūra, kas izsauca pati
sevi un pie nosacījuma, kas darbiniekam nav tiešo priekšnieku apstājās. Tas tika realizēts
izmantojot izņēmuma apstrādi – EXCEPTION WHEN NO_DATA_FOUND. Šīs procedūras
ķermenī atkal tika izmantots dinamiskais SQL un EXECUTE IMMEDIATE. Kopumā darba
uzdevuma norādījumi tika izpildīti. Problēmas veidojot procedūru sagādāja tas, ka vajadzēja
atgriezt viena uzdotā darbinieka priekšniekus, tādēļ vajadzēja katrā izsaukumā padot arī
pirmo uzdoto darbinieku. Tas veiksmīgi arī izdevās.
51
Kopumā darba uzdevuma nosacījumus izdevās veiksmīgi izpildīt, pat rekursiju, kas
nebija obligāta. Bija iespējams uzdevumus realizēt arī savādāk, taču tika izmantots
dinamiskais SQL.
52
Literatūra
http://www.experts-exchange.com/Database/Oracle/Q_20651117.html
http://www.techonthenet.com/oracle
http://www.psoug.org/reference/procedures.html
Oracle SQL Developer - Help
prof. Eiduka lekciju konspekts
53