rĪgas tehniskĀ universitĀte web viewlikumiem atbilstošais tips, kurā ir definēti divi...
TRANSCRIPT
RĪGAS TEHNISKĀ UNIVERSITĀTE
DATORZINĀTNES UN INFORMĀCIJASTEHNOLOĢIJAS FAKULTĀTE
Deduktīvās datu bāzes projektēšana un izstrāde
Izstrādāja Edgars Matisāns
2009./2010. mācību gads
Anotācija
Dotā darba tēma ir deduktīvās datu bāzes projektēšana un izstrāde, kas sevī ietver likumu
datu bāzes projektējuma izstrādi, objekta tipu definēšanu, likumu, faktu, izvedumu koka
uzglabāšanas struktūru izveidošanu, kā arī procedūru un funkciju paketes izveidošanu, kas
nodrošina deduktīvās datu bāzes darbības.
Darbs sastāv no praktiskā darba, kas tika veikts izmantojot Oracle 10g datu bāzes vadības
sistēmu un SQL grafisko klienta lietojumu Oracle SQL Developer, un šī apraksta, kas iever
lietotās komandas un to aprakstus.
Darbā iekļauti 46 attēli, 5 literatūras avoti bibliogrāfiskajā rādītājā un darba kopējais
apjoms ir 32 lpp.
Saturs
UZDEVUMA APRAKSTS..........................................................................................................................................4
1. DATU BĀZES PROJEKTĒŠANA.........................................................................................................................5
2. OBJEKTA TIPU IZVEIDOŠANA.........................................................................................................................7
3. LIKUMU UN FAKTU UZGLABĀŠANAS STRUKTŪRU IZVEIDOŠANA....................................................8
4. DEDUKTĪVĀS DATU BĀZES PROGRAMMU PAKETES IZSTRĀDE.......................................................13
5. DEDUKTĪVĀS DATU BĀZES PIELIETOJUMS..............................................................................................23
6. DEDUKTĪVĀS DATU BĀZES PĀRBAUDE......................................................................................................27
SECINĀJUMI.............................................................................................................................................................30
IZMANTOTĀ LITERATŪRA..................................................................................................................................32
Uzdevuma apraksts
Darba uzdevums sastāv no sekojošiem apakš uzdevumiem:
1. Datu bāzes projektēšana.
2. Objekta tipu izveidošana.
3. Likumu, faktu un izvedumu koka datu uzglabāšanas struktūru izveide.
4. Procedūru un funkciju paketes realizācija, kas nodrošina deduktīvās datu bāzes darbības.
5. Deduktīvās datu bāzes darbību pielietojums.
6. Deduktīvās datu bāzes pārbaude.
4
1. Datu bāzes projektēšana
Par dotā darba tēmu tika izvēlēts ģimeņu koki, tā kā šis ir viens no klasiskajiem deduktīvās
datu bāzes pielietojuma piemēriem. Tā kā vairāku attieksmju, kas pastāv starp ģimenes
locekļiem, to starpā attieksme „māsa”, abstraktas realizācija tika apskatītas nodarbību laikā, tad,
kā primārais uzdevums, kas tiks risināts izstrādātajā deduktīvajā datu bāzē, ir pasniedzēja
piedāvātā attieksme „vecmāte”.
Taču, jau datu bāzes projektēšanas stadijā, tika paredzēta iespēja nemainot datu bāzes
elementu (procedūru, funkciju) realizāciju veikt arī citus uzdevumus, piemēram, meklēt
personas, vecvecākus, māsas, brāļus utt., kas tiek demonstrēts nodaļā, kas apraksta datu bāzes
paplašinājuma darbību.
Deduktīvās datu bāzes likumu un faktu glabāšanai un apstrādei, tiek izmantoti objekti,
objektu tabula un tabula ar objektu kolonnām (skat. 1.2. attēlu), kas ļauj visu informāciju, kas
attiecas uz vienu likumu, glabāt vienkopus. Attēlā ilustrētā tabula LIKUMI paredzēta likumu
uzglabāšanai. Lauks PREDIKATS satur informāciju par predikātu. Ja predikāts ir vienkāršs
likums (fakta tipa), piemēram, VECAKS, tad lauks SASTAVDALAS ir tukšs. Ja predikāts ir
salikts likums (likuma tipa), piemēram, VECVECAKS, tad laukā SASTAVDALAS ir iekļauti
citi likumi, konkrētajā gadījumā, likums VECAKS (Tevs, Dels) un VECAKS (Vectevs, Tevs).
Tabula IZVEDUMU_KOKS paredzēta uzdevuma izpildes laikā izmantoto likumu
uzglabāšanai, kā arī substitūciju veikšanai. Proti, šajā tabulā tiek ievietots sākotnējais likums,
kuram tiek veikta dekompozīcija, līdz tas satur tikai faktu tipa likumus (likumus, kas nesastāv no
citiem likumiem). Pēc dekompozīcijas tiek veikta formālo un reālo argumentu substitūcija visā
hierarhijas līmenī. Tādējādi, formālie argumenti visos tabulas IZVEDUMU_KOKS likumos tiek
aizvietoti ar lietotāja norādītajiem argumentiem (argumentu), kas, izveidojot atbilstošu
vaicājumu, ļauj rast atbildi lietotāja deduktīvās datu bāzes jautājumu.
1.1. att. Likumu un izvedumu koka tabula
Lai nodrošinātu pēc iespējas mazāku deduktīvā paplašinājuma atkarību no problēmas
sfēras datu bāzes, faktu izgūšanai tiek izmantots universāls interfeiss – datu bāzes skats (skat.
1.2. attēlu), no kura ir iespējams izgūt visus faktus. Tādējādi, deduktīvais lietojums vienmēr
sadarbojas tikai ar likumu, izvedumu koka un faktu tabulu. Šāda faktu nodalīšana no reālajiem
5
datiem ļauj salīdzinoši vienkārši pievienot jaunas problēmas sfēras tabulas, papildus tabulai
PERSONAS, tajā pat laikā nemainot skata FAKTI interfeisu. Šādā gadījumā mainītos tikai skata
fakti vaicājums, taču formāts un lauki, kurus iespējams izgūt, netiek mainīti.
Lai aprakstītu ģimenes koku, tai skaitā personas vārdu, dzimumu un vecākus, tiek
izmantota viena tabula, lai gan, tik pat labi var izmantot arī vairākas. Izstrādātā arhitektūra
nodrošina brīvību šajā jautājumā, ar vienīgo ierobežojumu, datu bāzē jābūt pieejamam skatam
FAKTI ar trijiem 1.2. attēlā norādītajiem laukiem. Tas, no kurienes šie dati tiek ņemti, deduktīvo
datu bāzes paplašinājumu neietekmē.
1.2. att. Personu tabula un tai atbilstošais faktu skats
Jau datu bāzes projektēšanas stadijā tika pieņemts ierobežojums, atļaut izmantot likumus
vai faktus ar diviem argumentiem. Lai gan sarežģītu problēmu risināšanai šis ierobežojums
nebūtu pieļaujams, dotajā gadījumā tas vienkāršo izstrādājamās procedūras un funkcijas, tai pat
laikā būtiski neierobežojot deduktīvās datu bāzes funkcionalitāti.
6
2. Objekta tipu izveidošana
Pēc datu bāzes projektējuma izstrādes, tiek veidoti likumu un faktu uzglabāšanai un
apstrādei izmantotie objekti. Likumu attēlošanai tika izmantota objektu pieeja, tā kā tā ļauj
iekapsulēt visu informāciju, kas attiecas uz likumu, vienā objektā, tādējādi uzlabojot tās
uztveramību un atvieglojot funkciju un procedūru izveidi.
Objekta tipa PREDIKATS_TIPS (skat. 2.1. attēlu) sastāv no trīs laukiem: nosaukuma un
divu argumentu laukiem. Kā tas tika iepriekš minēts, tad, izpildot uzdevumu, tika pieņemts, ka
faktiem un predikātiem iespējams norādīt divus atgumentus. Tāpat tiek definēta MAP tipa
metode, kas ļaus veikt sakārtošanu pēc tabulas kolonnas ar objekta tipu PREDIKATS_TIPS.
2.1. att. Objekta tips PREDIKATS_TIPS
Objekta tipa ķermenis (skat. 2.2. attēlu) sastāv no metodes VERTIBA implementācijas.
2.2. att. Objekta tipa PREDIKATS_TIPS ķermenis
Tā kā sarežģīti likumi var sastāvēt no vairākiem citiem likumiem, tad vairāku likumu
uzglabāšanai tiek izveidots objekta tipa PREDIKATS_TIPS kolekcijas tips
PREDIKATU_KOL_TIPS (skat. 2.3. attēlu).
2.3. att. Kolekcijas tips PREDIKATU_KOL_TIPS
Likumiem atbilstošais tips, kurā ir definēti divi lauki, viens no kuriem glabā informāciju
par predikātu, bet otrs – par predikātu kolekciju, no kā sastāv konkrētais predikāts, ilustrēts
2.4. attēlā.
2.4. att. Objekta tips LIKUMS_TIPS
7
3. Likumu un faktu uzglabāšanas struktūru izveidošana
Likumu glabāšanai tiek izveidota objektu tabula LIKUMI (skat. 3.1. attēlu). Tā kā katrs
likums tiek unikāli identificēts izmantojot tā nosaukumu, tad tiek izveidots ierobežojums, kas
nodrošina unikāla nosaukuma nosacījumu.
3.1. att. Tabula LIKUMI
Deduktīvās datu bāzes operācijās tiek izmantota „darba” jeb izvedumu koka tabula, kurā,
uzsākot izskaitļošanu, tiek kopēti nepieciešamie likumi, kas tiek sadalīti tos veidojošajos
likumos, līdz tiek iegūti faktu tipa likumi. Nākamajā solī tiek veikta formālo argumentu
substitūcija. Izvedumu koka tabulas izveidošana ilustrēta 3.2. attēlā.
3.2. att. Tabula IZVEDUMU_KOKS
Pēc likumu tabulas nodefinēšanas tajā tiek ievietoti likumi (skat. 3.3. attēlu). Tabulā
LIKUMI tiek ievietoti objekta tipa LIKUMS_TIPS objekti, kas sastāv no diviem argumentiem.
Kā redzams attēlā, tad vienkāršiem likumiem (likumi, kas netiek uzdoti izmantojot citus
likumus), piemēram, DZMIMUMS, VECAKS objekta LIKUMS_TIPS konstruktorā netiek
norādīts otrs arguments. Savukārt, definējot sarežģītus likumus (likumi, kas ir uzdoti izmantojot
citus likumus), tiek norādīta kolekcija, kurā iekļautas likuma sastāvdaļas – citi likumi. Jāatzīmē
to, ka atšķirtu predikātu mainīgos no konstantēm jeb simbolu virknes, tad tika ieviests mainīgo
nosaukšanas likums, kas paredz to, ka mainīgā nosaukums sākas ar „#” simbolu. Lai gan 3.3.
attēlā redzamie mainīgie nosaukti cilvēkam saprotamā veidā, piemēram, „#cilveks”,
„#dzimums”, šo mainīgo nosaukums neietekmē deduktīvās datu bāzes darbību, un tik pat labi
mainīgos varēja nosaukt „#x1”, „#x2”. Svarīgs ir ievērot to, ka definējot likuma sastāvdaļas jeb
likumus, no kā sastāv konkrētais likums, vienas un tās pašas būtības apzīmēšanai ir jāizmanto
tāds pats nosaukums. Pareizi uzdota likuma piemērs: VECTEVS(#vectevs, #mazberns):
VECVECAKS(#vectevs, #mazberns), DZIMUMS(#vectevs, vīrietis). Kā redzams, vectēva
apzīmēšanai gan likumā VECTEVS, gan likumā VECVECAKS tiek izmantots mainīgais
#vectevs.
8
3.3. att. Datu ievade tabulā LIKUMI
Problēmas sfēras (ģimenes koka un personas datu) datu uzglabāšanai tiek izveidota tabula
PERSONAS (skat. 3.4. attēlu). Tabulā tiek glabāts personas vārds, pie tam tika pieņemts, ka
personas vārds ir unikāls, tādējādi ar tā palīdzību ir iespējams viennozīmīgi identificēt personu,
dzimums, kā arī atsauces uz rakstiem par personas tēvu un māti.
3.4. att. Tabula PERSONAS
Lai būtu iespējams pārbaudīt izstrādāto deduktīvo datu bāzes lietojumu, tabulā
PERSONAS tiek ievadīti dati par trijās paaudzēs dzīvojošām personām (skat. 3.5. attēlu).
9
3.5. att. Datu ievade tabulā PERSONAS
Ievadītie dati uzskatāmi ilustrēti 3.6. attēlā.
3.6. att. Vecāku / bērnu hierarhija
10
Kā jau iepriekš minēju, tad, lai realizētu deduktīvās datu bāzes operācijas, ir jāpanāk pēc
iespējas mazāka sasaiste ar problēmas sfēras tabulām. Šī iemesla dēļ, sadarbības pamatā ar
deduktīvās datu bāzes funkcijām un procedūrām ir skats FAKTI (skat. 3.7. attēlu). Šī skata
mērķis ir izgūt datus no visām problēmas sfēras tabulām (šajā gadījumā tā ir tikai viena -
PERSONAS) un attēlot tos tādā formā, ka pirmā kolonna satur fakta nosaukumu, otrā un trešā
kolonna satur argumentu vērtības. Pie tam, argumentu vērtības tiek norādītas tieši tādā pašā
secībā, kā tas tika norādīts atbilstošajā likumā - tabulas LIKUMI rakstā.
3.7. att. Skats FAKTI
Skata FAKTI pirmie 25 atgrieztie raksti ilustrēti 3.8. attēlā, atlikušie raksti ilustrēti 3.9.
attēlā.
11
3.8. att. Datu izgūšana no tabulas FAKTI (1)
3.9. att. Datu izgūšana no tabulas FAKTI (2)
12
4. Deduktīvās datu bāzes programmu paketes izstrāde
Deduktīvās datu bāzes operāciju realizēšanai nepieciešams izveidot vairākas procedūras un
funkcijas, kuras ir ērti uzglabāt vienuviet. Šī iemesla dēļ tiek izveidota programmu pakete
DEDUKTIVA_PAKOTNE (skat. 4.1. attēlu). Paketē tiek definēts asociētā masīva tips
VAIC_ALIAS_PEC_MAINIGA, kurā tiks glabātas teksta datu tipa vērtības pēc noteiktas teksta
atslēgas. Tāpat paketē tiek definētas funkcijas un metodes, kas tiks detalizēti aprakstītas šajā
nodaļā.
4.1. att. Programmu pakete DEDUKTIVA_PAKOTNE
Programmu paketes DEDUKTIVA_PAKOTNE ķermeņa definēšana ilustrēta 4.2. attēlā.
Attēlā nav ilustrēts paketes ķermenī esošās funkcijas un procedūras, jo katra no tām tiks apskatīta
individuāli, sniedzot detalizētus paskaidrojumus.
4.2. att. Programmu paketes DEDUKTIVA_PAKOTNE ķermeņa fragments
Kā pirmā programmu paketes DEDUKTIVA_PAKOTNE sastāvdaļa tiks apskatīta funkcija
IR_MAINIGAIS (skat. 4.3. attēlu), kas nosaka, vai simbolu virkne ir mainīgais. Kā jau iepriekš
minēju, tad šajā deduktīvās datu bāzes lietojumā tika pieņemts, ka mainīgo nosaukumi sākas ar
„#” simbolu. Savukārt simbolu virkne, kas nesākas ar šo simbolu tiek interpretēta kā konstante,
piemēram, cilvēka vārds vai dzimums. Izstrādātajā lietojumā šī funkcija tiek izmantota gan
13
veicot substitūcijas, lai noskaidrotu, vai konkrēto argumentu drīkst aizvietot, gan SQL vaicājuma
ģenerēšanas laikā, tā kā apakšvaicājumus drīkst savienot tikai pēc kolonām, kas ir likumu
mainīgie.
4.3. att. Funkcija IR_MAINIGAIS
Funkcija AIZVIETOT_ATRIBUTUS (skat. 4.4. attēlu) paredzēta formālo likuma
argumentu aizvietošanai uz uzdotajiem. Vispirms tiek aizvietoti likuma predikāta daļā esošie
argumenti, pēc tam katras sastāvdaļas, proti, saistīto predikātu argumenti.
4.4. att. Funkcija AIZVIETOT_ATRIBUTUS
Funkcijas AIZVIETOT_ATRIBUTUTUS pielietošanas piemērs ilustrēts 4.5. attēlā. Kā
redzams, izsaucot procedūru kā parametrs tiek nodots likums un jaunā likuma predikāta daļa.
Funkcija veic formālo argumentu un konkrēto argumentu substitūciju.
14
Predikāts Saistītie likumiVECTEVS(#vectevs, #mazberns): VECVECAKS(#vectevs, #mazberns), DZIMUMS(#vectevs, virietis)
AIZVIETOT_ATRIBUTUTUS ( , VECTEVS(Vitauts, #mazberns))
VECTEVS(Vitauts, #mazberns): VECVECAKS(Vitauts, #mazberns), DZIMUMS(Vitauts, virietis)4.5. att. Funkcijas AIZVIETOT_ATRIBUTUTUS pielietojums
Procedūra MEKLET veic izveduma koka datu, kas tika iegūti iepriekšējā izskaitļošanas
reizē, dzēšanu, kā arī izsauc procedūru IZVEST, kas veic izveduma koka aizpildīšanu.
4.6. att. Procedūra MEKLET
Procedūra IZVEST (skat. 4.7. attēlu) veic izveduma koka aizpildīšanu.
4.7. att. Procedūra IZVEST
15
Pēc tā kā sākotnējā likuma formālie argumenti tiek aizvietoti uz reālajiem, likums tiek
ievietots izvedumu kokā. Ja likums ir vienkāršs, proti, tas nesastāv no citiem likumiem, tad
procedūra tiek pabeigta, pretējā gadījumā procedūra tiek izpildīta rekursīvi, kā parametrus
norādot likuma sastāvdaļas. Ja norādītais likums netiek atrasts, tiek izraisīta kļūda jeb izņēmuma
situācija, ar numuru -20333, kas tika patvaļīgi izvēlēts no atļauto kļūdu diapazona, kas tiek
nodota izsaucošajam blokam.
Lai demonstrētu procedūras IZVEST darbību (skat. 4.8. attēlu), tiks izvests iepriekš
apskatītais likums VECTEVS(#vectevs, #mazberns), mainīgā #vectevs vietā uzdodot konstanti
„Vitauts”. Attēlā redzams, ka pēc procedūras IZVEST izsaukšanas, izveduma koka tabulā ir
ievietoti 5 raksti. Procedūra IZVEST tiek rekursīvi izsaukta tik ilgi, līdz visi likumi ir sadalīti
līdz faktu līmenim, un visu likumu argumenti ir aizvietoti. Kā redzams, konkrētajā gadījumā tika
iegūti 3 faktu līmeņa predikāti, kas tiks izmantoti vaicājuma sastādīšanā.
Predikāts Saistītie likumiVECTEVS(#vectevs, #mazberns) VECVECAKS(#vectevs, #mazberns), DZIMUMS(#vectevs, virietis)
IZVEST (VECTEVS(Vitauts, #mazberns))
VECTEVS(Vitauts, #mazberns): VECVECAKS(Vitauts, #mazberns), DZIMUMS(Vitauts, virietis)VECVECAKS(Vitauts, #mazberns): VECAKS(#vecaks, #mazberns), VECAKS(Vitauts, #vecaks)VECAKS(#vecaks, #mazberns)VECAKS(Vitauts, #vecaks)DZIMUMS(Vitauts, virietis)
4.8. att. Procedūras IZVEST pielietojums
Funkcija IZGUT_ELEMENTU (skat. 4.9. attēlu) paredzēta asociatīvā masīva elementa
izgūšanai. Šāda funkcija tika izveidota tādēļ, ka pieprasot asociatīvā masīva elementu pēc
indeksa (atslēgas), kas neeksistē masīvā, tiek radīta NO_DATA_FOUND izņēmuma situācija.
Funkcija IZGUT_ELEMENTU apstrādā šo izņēmuma situāciju un atgriež NULL, ja masīva
vērtība netika atrasta.
4.9. att. Procedūra IZGUT_ELEMENTU
Viena no svarīgākajām deduktīvās datu bāzes lietojuma funkcijām ir funkcija
GENERET_VAICAJUMU. Funkcija veic dinamisku SQL vaicājuma ģenerēšanu, kas sniedz
atbildi uz lietotāja definēto deduktīvās datu bāzes jautājumu.
16
Tā kā funkcija GENERET_VAICAJUMU ir salīdzinoši gara, tad tā tiks apskatīta, sadalot
to mazākos fragmentos.
Funkcijas deklarāciju sadaļā (skat. 4.10. attēlu) tiek definēti izmantojamie mainīgie,
galvenokārt simbolu virknes tipa mainīgie vaicājuma daļu uzglabāšanai.
4.10. att. Funkcijas GENERET_VAICAJUMU pirmais fragments
Tāpat deklarāciju sadaļā ir definēts kursors LIKUMU_KORSORS, kas izgūst datus no
izvedumu koka tabulas. Kursora vaicājuma atgrieztie dati likuma
VECTEVS(Vitauts, #mazberns) gadījumā ir ilustrēti 4.11. attēlā.
4.11. att. Kursora LIKUMU_KURSORS atgriezto datu piemērs
Jāatzīmē to, ka izvedumu tabulā tiek glabāti arī salikti likumi un izvedumu gaitā iegūtie
fakti, proti, likumi, kuru abi argumenti ir konstantes (skat. 4.12. attēlu). Saliktie likumi netiek
atlasīti, tā kā tie nav noderīgi vaicājuma sastādīšanā.
4.12. att. Vaicājumā neizmantojamo faktu piemērs
Nākamais funkcijas GENERET_VAICAJUMU fragments (skat. 4.13. attēlu) veic iteratīvu
izgūto likumu apstrādi, proti, tiek formēts apakšvaicājums, kas izgūst datus no skata FAKTI.
Likuma argumenti, kas nav mainīgie, proti, konstantes, tiek ievietotas apakšvaicājuma
17
nosacījuma daļā. Argumenti, kas ir mainīgie, tiek izmantoti savienojuma (JOIN) daļas
ģenerēšanā. Iepriekš aprakstītais argumentu pielietojums ir ilustrēts 4.18. attēlā.
4.13. att. Funkcijas GENERET_VAICAJUMU otrais fragments
Asociatīvas masīvs tiek izmantots tādēļ, lai uzglabātu apakšvaicājuma pseidonīmu un
kolonnas nosaukumu pēc argumenta mainīgā nosaukuma, ar kuru nepieciešams veidot
savienojumu.
Funkcijas GENERET_VAICAJUMU (skat. 4.14. attēlu) trešais fragments veic
savienojuma ON daļas ģenerēšanu. Svarīgi it tas, ka savienojuma ON daļā jāiekļauj precīzi visi
tie nosacījumi, kurus iespējams iegūt balstoties uz informāciju par šī un iepriekšējo likumu
argumentiem. Eksistē arī situācijas, kad kāda apakšvaicājuma ON daļā nav nosacījuma, pēc kura
apakšvaicājums tiek savienots, jo šis nosacījums var tikt lietots tikai nākamo apakšvaicājumu
18
savienojuma ON daļā. Tādā gadījumā, šī vaicājuma ON daļā tiek ievietots nosacījums, kas ir
vienmēr patiess, piemēram, 1 = 1 un tādējādi neierobežo atlasītos rakstus.
4.14. att. Funkcijas GENERET_VAICAJUMU trešais fragments
Pēc tā kā apakšvaicājumi ir sastādīti, tiek izveidots kopējais vaicājums (skat. 4.15. attēlu).
4.15. att. Funkcijas GENERET_VAICAJUMU ceturtais fragments
19
Piektajā funkcijas fragmentā ir implementēta vaicājuma datu atlases daļas (SELECT), kā
arī vaicājuma kopējā nosacījuma daļas (WHERE) formēšana. Principā, datu atlasei kopējā
nosacījuma daļa nav nepieciešama, jo izveidotais algoritms formē vaicājumu tā, ka dati tiek
atlasīti balstoties uz apakšvaicājumu datu atlases nosacījumiem un savienojumu ON daļā
iekļautajiem nosacījumiem. Taču, ģenerēto vaicājumu pārbaudes laikā tika atklāts, ka eksistē
speciālgadījumi, piemēram, likums BRALIS vai MASA, kuru dēļ kopējā vaicājumā ir jāiekļauj
nosacījums, ka pirmais arguments nav vienāds ar otro. Likums BRALIS(#bralis, #cits_berns),
kam atbilst likumi VECAKS(#tevs, #bralis), VECAKS(#tevs, #cits_berns), DZIMUMS#tevs,
virietis), VECAKS(#mate, #bralis), VECAKS(#mate ,#cits_berns), DZIMUMS(#mate, sieviete),
DZIMUMS(#bralis, virietis) neko nemin par to, ka persona nav pati sev brālis. Iepriekš minētie
likumi definē tikai to, ka brālis ir tāda persona, kas ir vīrietis, kuram ir kopīgi vecāki ar to
personu, kurai viņš ir brālis. Taču, šim likumam atbilst arī pats brālis. Tādēļ, kā jau minēju,
vaicājuma nosacījuma kopējā daļā vienmēr tiek pievienots nosacījums, ka likuma abi argumenti
nav vienādi. Funkcijas GENERET_VAICAJUMU rezultāts ir vaicājums.
Funkcija RISINAT_VAIC (skat. 4.16. attēlu) izsauc iepriekš definētās funkcijas, proti,
izveduma koka ģenerēšanu un vaicājuma ģenerēšanu. Šī funkcija var tikt definēta kā gala
funkcija lietotājiem, kas to izmantotu savās programmās, ar iespēju iegūt dinamiski ģenerētu
vaicājumu.
4.16. att. Funkcija RISINAT_VAIC
20
Funkcija RISINAT_VAIC var tikt izsaukta gan no citas procedūras, gan, piemēram, no
Java programmas, izmantojot, JDBC tehnoloģiju.
Lai funkcija RISINAT_VAIC atgriež vaicājumu, kas atbild uz deduktīvās datu bāzes
jautājumu, simbolu virknes formā, kurai ir plašs pielietojums, tomēr citās Oracle procedūrās ir
ērtāk izmantot funkciju, kas atgriež nevis pašu vaicājumu, bet gan tā rezultātu.
Funkcija RISINAT_REZ (skat. 4.17. attēlu) atgriež PREDIKATS_TIPS tipa kolekciju,
pirms tam dinamiski izpildot vaicājumu, izmantojot EXECUTE IMMEDIATE konstrukciju.
Jāatzīmē to, ka komanda EXECUTE IMMEDIATE tiek lietota kopā ar atslēgas vārdiem BULK
COLLECT INTO, kas nosaka to, ka dinamiski izpildītā vaicājuma rezultāta kolonnu vērtības tiek
ievietotas norādītajās kolekcijās. Tādējādi, funkcijā tiek izmantots nevis viens dinamiskā
vaicājuma rezultāta raksts, bet gan visi.
4.17. att. Funkcija RISINAT_REZ
Viena no garākajām un sarežģītākajām iepriekš apskatītajām funkcijām ir funkcija
GENERET_VAICAJUMU, kas veic rezultāta vaicājuma ģenerēšanu. Pie tam, kā jau iepriekš
minēju, tad šī funkcija nodrošina vaicājuma ģenerēšanu atbilstoši uzdotajam likumam.
Funkcijas algoritms meklējot likuma VECTEVS(Vitauts, #mazberns) atrisinājumu jeb
atbildi uz jautājumu, kam Vitauts ir vectēvs, vienkāršotā veidā ir ilustrēts 4.18. attēlā. Kā
redzams attēlā, tad likumu argumenti, kas ir konstantes, tiek izmantotas apakšvaicājumu
nosacījuma (WHERE) daļā, bet visi argumenti, kas ir mainīgie, tiek izmantoti apakšvaicājumu
savienojuma (JOIN ... ON) nosacījuma daļā. Algoritma būtība ir tāda, ka apakšvaicājumi tiek
savienoti pēc visiem laukiem, kas atbilst vienādiem likumu argumentu mainīgajiem.
21
4.18. att. Vaicājuma izveides algoritma piemērs
Iegūtā vaicājuma izpildes rezultāts ilustrēts 4.19. attēlā.
4.19. att. Piemēra vaicājuma izpildes rezultāts
22
5. Deduktīvās datu bāzes pielietojums
Izstrādātās deduktīvās datu bāzes darbība tiks ilustrēta uz vairāku likumu piemēra.
Kā pirmais, tiks apskatīts uzdevuma nostādnē minētais likums VECMATE(#vecmate,
#mazberns). Pieņemsim, ka nepieciešams noteikt vecmātes Daces mazbērnus. Tā kā izstrādātajā
programmu paketē iekļauta gan funkcija, kas atgriež vaicājumu, kas atbild uz noteikto jautājumu,
gan funkcija, kas atgriež faktu kolekciju, tad šajā gadījumā tiks izmantota otrā funkcija. Lai
attēlotu rezultātus, tie tiks izvadīti servera konsolē. Jāatzīmē, ka reālā lietojumā no šādas izvades
nebūtu nekādas jēgas, jo funkcijas atgrieztie dati tiktu tālāk apstrādāti izsaucošajā lietojumā.
Lai noskaidrotu vecmātes Daces mazbērnus, tiek izpildīts anonīmais PL/SQL bloks (skat.
5.1. attēlu), kurā tiek izsaukta funkcija RISINAT_REZ, kurai kā parametrs tiek nodots
PREDIKATS_TIPS tipa objekts, kur pirmais arguments (‘vecmate’) apzīmē likuma nosaukumu,
otrais arguments (‘Dace’) – vecmātes vārdu, bet trešais arguments, kurš netiek norādīts apzīmē
meklējamos mazbērnus.
5.1. att. Vecmātes Daces mazbērnu noskaidrošana
Funkcijas RISINAT_REZ atgrieztās kolekcijas elementi tiek drukāti servera izvades
buferī, kura saturs tiek izvadīts SQL Developer lietojuma skatā (skat. 5.2. attēlu). Kā redzams,
vecmātei Dacei ir trīs mazbērni: Ernests, Sabīne un Anna. Servera izvades buferī tiek izvadīts arī
likuma nosaukums un abi argumenti.
5.2. att. Noskaidrotie Daces mazbērni
Salīdzinot rezultātu ar faktu ievades laikā ilustrēto ģimeņu koku (skat. 3.6. attēlu),
redzams, ka deduktīvās datu bāzes paketes funkcija Daces mazbērnus ir noteikusi pareizi.
Ģimeņu koka fragments, kurā ilustrēta vecmāte Dace un viņas mazbērni, ilustrēta 5.3. attēlā.
23
5.3. att. Dace un viņas mazbērni
Lai demonstrētu deduktīvās datu bāzes lietojuma darbību gadījumā, ja tiek uzdots cits
likums, kā arī tie uzdots otrais arguments, tiks apskatīts likums VECVECAKS(#vecvecaks,
#mazberns). Pieņemsim, ka ir jānoskaidro visi Ērika vecvecāki. Dotā uzdevuma risināšanai tiek
izsaukta tā pati universālā funkcija RISINAT_REZ, kā parametrus nododot likuma nosaukumu
„vecvecaki”, NULL un mazbērna Ērika vārdu. Funkcijas parametri un rezultāts ilustrēti 5.4.
attēlā. Kā redzams attēlā, tad funkcija ir noteikusi visus četrus Ērika vecvecākus.
5.4. att. Noskaidrotie Ērika vecvecāki
Ērika un viņa vecvecāku kopējais ģimenes koks ilustrēts 5.5. attēlā.
24
5.5. att. Ēriks un viņa vecvecāki
Kā trešais piemērs tiek ilustrēts gadījums, kad deduktīvās programmu paketes funkcija tiek
izsaukta norādot tikai likuma nosaukumu, bet nenorādot tā argumentus. Pieņemsim, ka ir
jānoskaidro visi vectēvi un visi mazbērni, kam ir vectēvs. Šajā gadījumā tiek lietots likums
VECTEVS(#vectevs, #mazberns), nenorādot nevienu no argumentiem. Funkcijas izsaukums un
rezultāts ir ilustrēts 5.6. attēlā.
5.6. att. Visi vectēvi un viņu mazbērni
Kā ceturtais piemērs tiek ilustrēta izņēmuma situācija, kad izsaucot funkciju tiek norādīts
likuma nosaukums, kas nav ievietots likumu tabulā (skat. 5.7. attēlu). Kā redzams, funkcija rada
izņēmuma situāciju, kuras kļūdas ziņojums šajā gadījumā tiek izvadīts servera izvades buferī.
25
5.7. att. Risināšanas funkcijas izsaukums ar nezināmu likumu
26
6. Deduktīvās datu bāzes pārbaude
Iepriekšējā nodaļā tika demonstrēti vairāki izstrādātās deduktīvās datu bāzes darbības
piemēri. Šajā nodaļā tiks apskatīti piemēri jeb pierādījumi, kas apliecina to, ka izstrādātā datu
bāze patiešām var tikt uzskatīta par kaut kādā mērā deduktīvu datu bāzi.
Deduktīvu datu bāzi raksturo vairākas īpašības. Visbiežāk tiek pieminēts fakts, ka
deduktīva datu bāze spēj iegūt jaunus faktus. Šī ir ļoti svarīga īpašība, taču jaunus faktus var
iegūt arī ar datu bāzi vai tās lietojumu, kas izmanto funkcijā ieprogrammētus nosacījumu un
darbības. Tādēļ, manuprāt, daudz svarīgāka ir datu bāzes spēja pielāgoties (bez programmētāja
iejaukšanās, piemēram, funkciju papildināšanas) faktu un likumu maiņai. Šī iemesla dēļ tiks
demonstrēti divi gadījumi. Pirmajā gadījumā tiks pievienoti jauni fakti, kā rezultātā, bez
deduktīvās programmu paketes maiņas, izstrādātajam datu bāzes lietojumam būtu jāspēj
adoptēties jaunajam stāvoklim un atgriez likumiem atbilstošus rezultātus. Otrajā gadījumā tiks
pievienots jauns likums – MASA, kas aprakstīts attieksmi māsa. Pie tam, likuma pievienošana
tiks veikta tikai likumu sarakstam, kas glabājas tabulā LIKUMI. Nekādas izmaiņas programmas
pirmtekstā netiks veiktas. Tādējādi, jaunu likumu ieviešanu varētu salīdzināt ar maza bērna
apmācīšanu, kur bērnam tiek skaidrots, ka kāda persona ir citas personas māsa, ja šī persona ir
sieviete un abām personām ir vieni un tie paši vecāki.
Apskatot pirmo no iepriekš aprakstītajiem gadījumiem, pieņemsim, ka Sabīnei un Ērikam
ir piedzimusi meita Lilija. Vaicājums, kas ievieto datus tabulā PERSONAS, ilustrēts 6.1. attēlā.
6.1. att. Jaunas personas pievienošana
Manuprāt, deduktīvai datu bāzei ir jāspēj meklēt atrisinājumu gadījumā, ja sākotnējie dati
ir mainīti. Pieņemsim, ka ir jānoskaidro iepriekš pievienotās meitenes Lilijas vecvecāki.
Rezultātu noskaidrošanai tiek izmantota tieši tā pati funkcija, kas iepriekš – RISINAT_REZ.
Funkcijas atgrieztais rezultāts ir redzams 6.2. attēlā. Kā redzams, Lilijas vecvecāki ir Ieva,
Kārlis, Inese un Viesturs.
27
6.2. att. Noskaidrotie Lilijas vecvecāki
Ja salīdzina noteikto rezultātu ar 6.3. attēlā ilustrēto ģimenes koka fragmentu, tad redzams,
ka deduktīvās datu bāzes programmu pakete ir sniegusi pareizu rezultātu bez jebkādu izmaiņu
veikšanas paketes funkcijās vai procedūrās.
6.4. att. Lilija un viņas vecvecāki
Kā otrs no iepriekš aprakstītajiem gadījumiem tiks apskatīta jauna likuma pievienošana.
Pieņemsim, ka likumu krātuvi nepieciešams papildināt ar jaunu likumu MASA. Vienīgā, ko tādā
gadījumā ir nepieciešams papildināt, ir tabula LIKUMI. Likuma pievienošanas vaicājums ir
ilustrēts 6.5. attēlā. Kā redzams, tad tabulā tiek ievietots likuma nosaukums, formālie argumenti,
kā arī likumu kolekcija, no kā sastāv likums MASA.
28
6.5. att. Likuma MASA pievienošana likumu tabulai
Pēc likuma pievienošanas ir iespējams pārbaudīt deduktīvās datu bāzes darbību, nosakot
visas personas, kam Asnāte ir māsa. Standarta funkcijas izsaukums un tās atgrieztais rezultāts ir
ilustrēts 6.6. attēlā.
6.6. att. Asnātes brāļi un māsas
No abiem iepriekš demonstrētajiem piemēriem ir redzams, ka izstrādātā deduktīvā datu
bāze spēj korekti darboties arī pēc jaunu faktu un likumu pievienošanas, pie tam, bez
nepieciešamības veikt kādas izmaiņas izstrādātajā programmu paketē. Tādēļ, manuprāt,
svarīgākās deduktīvās datu bāzes īpašības tiek nodrošinātas.
29
Secinājumi
Laboratorijas darbā tika apskatīta deduktīvās datu bāzes projektēšana un veidošana DBPS
Oracle. Darba gaitā tika projektēta deduktīvā datu bāze, izveidoti faktus un likumus attēlojošie
objektu tipi, izveidotas likumu un izvedumu koka jeb „darba” tabulas, implementēta programmu
pakete, kas nodrošina deduktīvās datu bāzes darbības, kā arī pārbaudīta un demonstrēta
izstrādātās datu bāzes darbība.
Jau projektēšanas stadijā izstrādājamajai datu bāzei tika noteikti ierobežojumi. Pirmkārt,
likumu un fakti var saturēt tikai divus argumentus. Protams, nopietnā lietojumā tas būtu
ievērojams trūkums, taču šī darba uzdevuma izpildē šis ierobežojums atviegloja deduktīvās datu
bāzes operāciju izstrādi. Otrkārt, izstrādātais lietojums neļauj risināt uzdevumus, kuros tiek
izmantoti rekursīvi likumi, piemēram, likums SENCIS. Rekursīvu likumus varētu implementēt
izmantojot Oracle hierarhiskos vaicājumus. Taču neskatoties uz visiem iepriekš minētajiem
ierobežojumiem, manuprāt, izstrādātā datu bāze var tikt uzskatīta par deduktīvu, tādēļ ka, tā ir
adaptīva, proti, pievienojot jaunus faktus vai likumus, datu bāze turpina veiksmīgi meklēt
risinājumus, bez programmas pirmteksta maiņas. Proti, datu bāzes lietotājam ir jāievada jaunais
likums, piemēram, MĀSA, jānorāda tā formālie argumenti un jāizskaidro, kas tad ir likums
MĀSA, izmantojot kādus no esošajiem likumiem. Pēc likuma raksta ievietošanas datu bāzes
tabulā LIKUMI, lietotājs var izsaukt standarta risināšanas funkciju, kā argumentu norādot jauno
likumu.
Darba gaitā tika demonstrēta izstrādātā lietojuma spēja noteikt faktus, pirmkārt, ja tiek
uzdots likuma nosaukums un pirmais arguments, piemēram, atrast visus kādas personas
mazbērnus, otrkārt, ja tiek uzdots likuma nosaukums un otrais arguments, piemēram, atrast visas
kādas personas vecmātes un, treškārt, ja tiek uzdots tikai likuma nosaukums, piemēram, atrast
visus brāļus un personas, kam ir brāļi. Pie tam, šo visu uzdevumu veikšanā lietotājs izsauc vienu
un to pašu funkciju, kurā nav implementēti nekādi nosacījumi attiecībā uz likuma nosaukumu.
Visas darbības tiek veiktas dinamiski, izmantojot formālo un faktisko mainīgo substitūciju un
likumu sadalīšanu vienkāršos likumos un faktos.
Šajā darbā vairāk nekā citos laboratorijas darbos tika programmētas PL/SQL procedūras
un funkcijas. Šī iemesla dēļ tika apskatīts DB2 kursa 3. laboratorijas darbs, kas diezgan ātri ļāva
atsvaidzināt zināšanas par PL/SQL. Tā pat uzzināju daudz ko jaunu, piemēram, to, ka piekļūstot
asociatīvā masīva elementam pēc indeksa (atslēgas), kurš nav iepriekš ierakstīts masīvā, Oracle
rada izņēmuma situāciju. Sākumā biju pārsteigts par to, tā kā, piemēram, programmēšanas
valodā Java pieprasot Map tipa objektam vērtību pēc neeksistējošas atslēgas, tiek atgriezts
NULL. Bet palasot materiālus par asociatīvā masīva realizāciju, sapratu, ka šādas pieejas pamatā
30
ir tas, ka asociatīvā masīvam ir liela līdzība ar tabulu, un tur šāda situācija tiek apstrādāta tieši tā
pat. Vaicājums, SELECT .. INTO arī rada NO_DATA_FOUND izņēmuma situāciju, ja
vaicājums neatgriež datus. Lai atvieglotu izņēmumu apstrādi, tika izveidota funkcija, kas mēģina
izgūt asociatīvā masīva elementu, un kļūdas gadījumā to korekti apstrādā atgriežot NULL.
Tāpat uzzināju un pielietoju atslēgas vārdus BULK COLLECT iekš EXECUTE
IMMEDIATE komandas, kas ļauj atgrieztos datus ierakstīt kolekcijās. Šādā gadījumā
nepieciešams norādīt kolekciju katras kolonnas vērtībām.
Manuprāt, izstrādātā datu bāze var tikt uzskatīta par deduktīvu datu bāzi, bet kā jau minēju,
tā spēj risināt salīdzinoši vienkāršus uzdevumus, un nopietnāku uzdevumu risināšanā to būtu
nepieciešams papildināt.
31
Izmantotā literatūra
1. Prof. Jānis Eiduks. Lekciju konspekts priekšmetā „Progresīvās datu bāzes”. - 2007.
2. Using PL/SQL With Object Types: Oracle® Database PL/SQL User's Guide and
Reference / Internets. -
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/objects.htm
3. PL/SQL Collections and Records: Oracle / Internets. -
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/05_colls.htm
4. EXECUTE IMMEDIATE Statement: Oracle® Database PL/SQL User's Guide and
Reference / Internets. -
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/executeimmediate_s
tatement.htm
5. Error Handling: PL/SQL User's Guide and Reference Release 8.1.5/ Internets. –
http://www.camden.rutgers.edu/HELP/Documentation/Oracle/server.815/
a67842/06_errs.htm
32