Uzdevums - Web view1. Vienotas relāciju-objektu datu bāzes ar loģiski saistītām tabulām...
Transcript of Uzdevums - Web view1. Vienotas relāciju-objektu datu bāzes ar loģiski saistītām tabulām...
RĪGAS TEHNISKĀ UNIVERSITĀTE
Datorzinātnes un informācijas tehnoloģijas fakultāte
Lietišķo datorsistēmu institūts
1.praktiskais darbs
mācību priekšmetā
“Lielu datubāzu tehnoloģija”
Izstrādāja: Alīna Vasiļevska
III DB I, 121RDB488
2014./15. māc. gads
Saturs
Uzdevums.............................................................................................................................................3Darba uzsākšana...................................................................................................................................4Problēmvide..........................................................................................................................................51 Rindas tipa objektu tabula.............................................................................................................7
1.1 Tabula SAIMNIEKS1.......................................................................................................71.2 METADATI.....................................................................................................................11
2 Tabula ar objektu kolonu.............................................................................................................162.1 Tabula HENDLERIS.......................................................................................................162.2 Tabula EKSPERTS..........................................................................................................18
3 Tabula ar kolekciju......................................................................................................................213.1 Tabula KLUBS un KLUBA DARBINIEKI....................................................................21
4 Tabula ar heterogeniem objektiem..............................................................................................254.1 Tipu hierarhija. Tabulas CAC un CACIB EKSPERTI....................................................25
5 Skatu veidošana...........................................................................................................................285.1 Tabula SUNS un skats no vienas tabulas........................................................................285.2 Tabulas KONKURSS un PUNKTI. Skats no divām tabulām.........................................305.3 Objekta skats...................................................................................................................325.4 Objektu skatu hierarhija..................................................................................................34
6 Objekta atsauču 1:N veidošana...................................................................................................356.1 Tabulas SUNU CENTRS................................................................................................35
7 Atsauce uz skatu ar funkciju MAKE_REF()..............................................................................377.1 Tabula SPONSORI..........................................................................................................37
8 Objektu funkcijas un operatori vaicājumos.................................................................................389 Secinājumi...................................................................................................................................46
2
Uzdevums
1. Vienotas relāciju-objektu datu bāzes ar loģiski saistītām tabulām (tabula ar rindas tipa objektiem,
tabula ar objektu kolonu, tabula ar objektu kolekciju, tabula ar neviendabīgiem (heterogēniem)
objektiem projektēšana.
2. Objektu tabulas izveidošana, datu ievade, meta-datu izvade, objektu un to komponenšu datu
izguve (funkcija Value()).
3. Tabulas ar objektu kolonu izveidošana, datu ievade, meta-datu izvade, objektu un to komponenšu
datu izguve (punkta notācijas izmantošana).
4. Tabulas ar objektu kolekciju izveidošana, datu ievade, meta-datu izvade, objektu un to
komponenšu datu izguve (funkcija Table()).
5. Pakārtotu datu tipu hierarhijas izveidošana. Tabulas ar heterogeniem objektiem izveidošana, datu
ievade un dažāda tipa objektu un to komponenšu izvade.
6. Objektu skata izveidošana un datu (objektu un to komponenšu) izguve no objekta skata. Objektu
skatu hierarhijas izveidošana. Vaicājumi objektu skatu hierarhijai.
7. Objektu atsauču (REF) 1:N. izveidošana izmantojot funkciju REF(). Datu izgūšana (gan visa
objekta, gan tā komponenšu) izmantojot funkciju DEREF(). Objektu saites izveidošana ar skatu,
vaicājuma izpilde.
8. Funkciju un operatoru SUBMULTISET [OF], [NOT] MEMBER [OF], IS [NOT] A SET,
CARDINALITY(), [ALL] vai [DISTINCT] MULTISET EXCEPT(), [ALL] vai [DISTINCT]
MULTISET INTERSECT, [ALL] vai [DISTINCT] MULTISET UNION(), POWERMULTISET(),
POWERMULTISET_BY_CARDINALITY(), SET() izmantošana vaicājumos.
10. Izveidoto tipu un tabulu metadatu izguve no datu bāzes vārdnīcas ar SELECT vaicājumu
palīdzību.
9. Secinājumi (kas labs, kas slikts, kas noskaidrots, kādi ieteikumi).
3
Darba uzsākšana
Darbs veikts ar Oracle 10g, izmantojot datu bāzi, kas izveidota manā datorā, SQL vaicājumi
tika pildīti gar ar komandu rindas interpretatoru SQL+, gan ar SQL Developer rīkā palīdzību. Lai
rezultāti būtu pārskatāmi, izmantoju formatēšanas komandas (tās tiks aprakstītas pie konkrētu
vaicājumu izpildes), dažreiz rezultātu bija ērtāk apskatīt SQL Developer rīkā, kur tika izveidots
savienojums ar izveidotu datu bāzi. Darbā izmantoju to pašu datu bāzes tematiku, kā iepriekšēja
kursa ietvaros – tabulas apraksta suņu izstādes organizēšanas procesu. 6.lpp redzams datu bāzes
aptuvenais fiziskais modelis, tas ir vienkāršots salīdzinot ar iepriekšējo kursu, bet darba gaitā tas
tiks uzlabots, jo parādīsies tipu hierarhija, atsauces un tabulas tiks nedaudz izmainītas, lai varētu
izpildīt nepieiešamus uzdevumus.
1.att. Savienojuma izveide SQL developer rīkā
2.att. Darba uzsākšana ar SQL+
4
Problēmvide
5
Hendleri strādā suņu centros, kur notiek nodarbības
Suņi piedalās konkursos
Hendleri apmāca suņus un rāda viņus ekspertiem
Suņi iegūst punktu skaitu
Saimnieki rupējas par saviem suņiem
Klubos strādā klubu darbinieki
Eksperts tiesā konkursu
3.att. Datu bāzes aptuvenais fiziskais modelis
6
1 Rindas tipa objektu tabula
1.1 Tabula SAIMNIEKS1
Lai attēlotu informāciju par suņu saimniekiem iespējams izveidot relāciju tabulu, ko
vēlāk aizpildīt ar datiem, piemēram:
CREATE TABLE SAIMNIEKS1 (SAIMNIEKS_ID NUMBER CONSTRAINT SAIMNIEKSID PRIMARY KEY,SAIMNIEKS_VAR VARCHAR2(15) CONSTRAINT SAIMNIEKSVAR NOT NULL,SAIMNIEKS_UZV VARCHAR2(20) CONSTRAINT SAIMNIEKSUZV NOT NULL,SAIMNIEKS_PK VARCHAR2(12) CONSTRAINT SAIMNIEKSPK NOT NULL,SAIMNIEKS_VALSTS VARCHAR2(20) DEFAULT 'Latvija',SAIMNIEKS_DZIMUMS VARCHAR2(12));
Bet tā kā tabulas SAIMNIEKS un EKSPERTS satur identiskus informācijas laukus
(kolonnu nosaukumi ir vienādi), es izveidoju tipu PERSONA, kas satur visus nepieciešamus laukus,
informācijai par cilvēku.
CREATE or REPLACE TYPE PERSONA as OBJECT(VAR VARCHAR2(15),UZV VARCHAR2(20),PK VARCHAR2(20),VALSTS VARCHAR2(20),DZIMUMS VARCHAR2(12));
4.att. Jauns tips SQL Developer rīkā
7
Un kad tips ir izveidots, veidojam tabulu ar rindas tipa objektiem, kurai nav definētas
kolonnas, bet kolonna atbilst vienam objektam. Tā būs tabula SAIMNIEKS, kas sastāvēs no tipa
PERSONA objektiem.
CREATE TABLE SAIMNIEKS1 OF PERSONA;
5.att. Jauna tabula SQL Developer rīkā
6.att. Tabulas atribūti SQL Developer rīkā
Tabulā SAIMNIEKS1, kā relāciju tabulā ievietojam 3 rindiņas ar objektiem PERSONA:
begininsert into SAIMNIEKS1 values(PERSONA('Alina','Vasilevska','010293-15893','Latvija','sieviesu'));insert into SAIMNIEKS1 values(PERSONA('Olga','Petuhova','010583-18563','Lietuva','sieviesu'));insert into SAIMNIEKS1 values(PERSONA('Svetlana','Kolosova','150273-17393','Igaunija','sieviesu'));end;
Lai pārliecinātos, ka dati tika pievienoti, SQLdeveloper lietotnē atveram sadaļu Data un
apskatām izveidotus ierakstus.
7.att. Tabulas ieraksti SQL Developer rīkā
Iespējams arī modificēt objektu, piemēram, nomainot valsti Svetlanai Kolosovai:
UPDATE SAIMNIEKS1 A SET A= PERSONA('Svetlana','Kolosova','150273-
8
17393','LIETUVA','sieviesu') where VAlue(A).VAR='Svetlana' and VAlue(A).UZV='Kolosova';
8.att. Objekta datu atjaunošana
Pēc eksperimenta nomainām valsti atpakaļ uz Igauniju. Tagad izvadīsim datus no mūsu
tabulas, objektu veidā, izmantojot funkciju VALUE. Izvadīsim informāciju par objektiem, kuru
dzimums ir sieviešu.
select VALUE(A) from SAIMNIEKS1 A where VALUE(A).dzimums = 'sieviesu';
9.att. vaicājuma rezultāts SQL developer rīkā
10.att. vaicājuma rezultāts SQL+
Izvadīsim informāciju par saimniekiem no Latvijas.
select VALUE(A) from SAIMNIEKS1 A where VALUE(A).Valsts ='Latvija';
11.att. vaicājuma rezultāts SQL developer rīkā9
12.att. vaicājuma rezultāts SQL+
Izvadīsim vārdu un personas kodu saimniekam ar uzvārdu Vasiļevska:
SELECT Distinct VALUE(A).VAR, VALUE(A).PK from SAIMNIEKS1 A where VALUE(A).UZV = 'Vasilevska';
13.att. vaicājums un tā rezultāts SQLdeveloper rīkā
14.att. vaicājums un tā rezultāts SQL+
Tagad izpildīsim to pašu vaicājumu tabulai kā relāciju tabulai:
Select Distinct VAR, PK from SAIMNIEKS1 A where A.UZV='Vasilevska';
10
15.att. vaicājums un tā rezultāts SQL developer rīkā
16.att. vaicājums un tā rezultāts SQL+
Redzam, ka ar izveidoto tabulu var strādāt gan kā ar relāciju tabulu, gan arī kā ar
objektu tabulu.
1.2 METADATI Tabulas metadati:
Pa kolonnam izvadīsim tabulas SAIMNIEKS1 metadatus.
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME IN ('SAIMNIEKS1');
Rezultātu redzēsim šādi:
11
17.att. Metadatu izguves rezultāts
Izmantojam komandu set linesize, lai izmainītu ekrāna rindiņas izmēru.
set linesize 15000;
Un tad attēlojums mainās, un informācija kļūst uztverama.
18.att. Metadatu izguves rezultāts
12
Diemžēl, jāatzīst, ka netiek attēlota visa pieprasīta informācija (trūkst kolonnas
DATA_LENGTH), to var atrisināt šādi:
column TABLE_NAME format a14;column COLUMN_NAME format a8;column DATA_TYPE format a9;column DATA_LENGTH format 99999;column DATA_PRECISION format 99999;column DATA_SCALE format 999999;
19.att. Metadatu izguves rezultāts
Metadatu izgūšanas vaicājumu var izpildīt arī SQL developer rīkā, tad nav nepieciešams
pielietot formatēšanas izmaiņas.
20.att. Metadatu izguves rezultāts SQL Developer rīkā
13
Tabulas tips:
Lai pārbaudītu, vai dotā tabula ir objektu tabula nepieciešams noskaidrot tās tipu, to var
izdarīt sekojoši:
select Table_name, table_type from user_all_tables where TABLE_NAME ='SAIMNIEKS1';
21.att. Tabulas tipa izguve
Izveidosim vienu relāciju tabulu un apskatīsimies, kāds tips tiks norādīts tai.
CREATE TABLE KONKURSS (KONKURSS_ID NUMBER CONSTRAINT KONKURSSID PRIMARY KEY,KONKURSS_NOS VARCHAR2(15) CONSTRAINT KONKURSSNOS NOT NULL,KONKURSS_LAIKS VARCHAR2(5) CONSTRAINT KONKURSSLAIKS NOT NULL);
select Table_name, table_type from user_all_tables where TABLE_NAME ='KONKURSS';
22.att. Relāciju tabulas tipa izguve
Redzam, ka relāciju tabulai tips netiek norādīts.
Objektu metadati:
Tātad mums izdevās iegūt metadatus par tabulām. Tagad iegūsim metadatus par
objektiem. Sākumā izmēģināju izvadīt visus objektus:
select Object_name, Object_id, Data_object_id, Object_Type, Created from user_objects;
23.att. Objekta metadatu izvade
Vaicājuma rezultātā tika iegūtas 462 rindiņas, tāpēc ierobežosim vaicājumu ar
nosācījumu. Izvadīsim datus par objektiem, kuru nosaukums ir SAIMNIEKS1.
select Object_name, Object_id, Data_object_id, Object_Type, Created from user_objects where object_name = 'SAIMNIEKS1';
14
24.att. Objekta SAIMNIEKS1 metadatu izguve SQL Developer rīkā
Iespējams izvadīt arī datus par visiem izveidotiem tipiem.
select Object_name, Object_id, Data_object_id, Object_Type, Created from user_objects where object_type='TYPE';
25.att. Izveidoto tipu metadati SQL Developer rīkā
Redzam, ka mūsu datu bāzē ir definēti divi tipi, pirmai, visticamāk tika ģenerēts
automātiski pie datu bāzes izveidošanas, un otrais ir mūsu definēts tips PERSONA.
15
2 Tabula ar objektu kolonu
2.1 Tabula HENDLERIS
Tagad izveidosim tabulu HENDLERIS ar objektu kolonnu. Tabulā glabāsies informācija par
hendlera personas datiem (objekts PERSONA) un papildus tam tabulā būs kolonna ar ID tam suņu
centram, kurā hendleris strādā.
CREATE TABLE HENDLERIS(HENDLERIS_ID NUMBER PRIMARY KEY,PERS_DATI persona,CENTRS_ID number);
Lai nodrošinātu tabulas ierakstiem automātisku primāro atslēgu, izveidosim virkni.
CREATE SEQUENCE HENDLERIS_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
Un ievietojam tabulā datus par hendleriem: Igors Ivanovs (viņa ID ir 1) no Krievijas ar
personas kodu 250662-10452, kas strādā suņu centrā ar ID 2 un Inna Lapse (viņas ID ir 2) no
Latvijas ar personas kodu 250662-10452, kas arī strādā tajā pašā suņu centrā ar ID 2.
INSERT INTO HENDLERIS values(HENDLERIS_VIRKNE.NEXTVAL, Persona('Igors','Ivanovs','250662-10452','Krievija','viriesu'),2);INSERT INTO HENDLERIS values(HENDLERIS_VIRKNE.NEXTVAL, Persona('Inna','Lapse','250662-10452','Latvija','sieviesu'),2);
Lai turpmāk varētu izvadīt ierakstītus datus, nepieciešams izpildīt komandu:
COMMIT
Tagad izvadām informāciju par hendleriem objektu veidā:
SELECT A.PERS_DATI as Persona, A.CENTRS_ID from HENDLERIS A;
26.att. Hendleru datu izguve objektu veidā
Parasti ir nepieciešams izvadīt kādu konkrētu informāciju par objektu, tāpēc izgūsim
hendlera vārdu, uzvārdu un ID suņu centram, kurā strādā hendleris.
select A. PERS_DATI.UZV as Uzvards, A. PERS_DATI.VAR as Vards, A.CENTRS_ID as Sunu_centrs from HENDLERIS A;
16
27.att. Konkrētas informācijas izguve par hendleriem
METADATI
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME IN ('HENDLERIS');
28.att. Tabulas HENDLERIS metadatu izguve SQL Developer rīkā
Noskaidrosim tabulas tipu:
select Table_name, table_type from user_all_tables where TABLE_NAME ='HENDLERIS';
29.att. Tabulas HENDLERIS tipa izguve
Iegūsim metadatus par objektiem ar nosaukumu HENDLERIS:
select Object_name, Object_id, Data_object_id, Object_Type, Created from user_objects where Object_name = 'HENDLERIS';
17
30.att. Objektu HEDLERIS metadatu izguve SQL Developer rīkā
2.2 Tabula EKSPERTS
Līdzīgi tiek izveidota arī tabula EKSPERTS, kas satur PERSONA tipa objektu kolonnu.
Veidojam tabulu EKSPERTS, kas sastāvēs no tipa PERSONA objektiem un Eksperta ID un
sertifikāta numura.
CREATE TABLE EKSPERTS(EKSPERTS_ID NUMBER PRIMARY KEY,PERS_DATI persona,SERT_NR varchar2(20));
Līdzīgi, kā iepriekšējai tabulai nodrošināsim automātisku numerāciju ar virknes
palīdzību:
CREATE SEQUENCE EKSPERTS_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
Tabulā EKSPERTS ievietojam 3 rindiņas ar objektiem PERSONA:
begininsert into EKSPERTS values(EKSPERTS_VIRKNE.NEXTVAL, PERSONA('Eriks','Detlovs','250662-10452','Latvija','viriesu'), '256825');insert into EKSPERTS values(EKSPERTS_VIRKNE.NEXTVAL, PERSONA('Olga','Kazakova','011283-13698','Lietuva','sieviesu'), '259963');insert into EKSPERTS values(EKSPERTS_VIRKNE.NEXTVAL, PERSONA('Irina','Klavina','260273-15205','Igaunija','sieviesu'), '25698530');end;
18
31.att. Tabulā EKSPERTS ievietoti dati
SELECT A.PERS_DATI as Persona from EKSPERTS A;
32.att. Datu izguve no tabulas EKSPERTS
select A. PERS_DATI.UZV as Uzvards, A. PERS_DATI.VAR as Vards, A.SERT_NR as Sertifikats from EKSPERTS A;
33.att. Datu izguve no tabulas EKSPERTS
METADATI
Tabulas metadati:
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME IN ('EKSPERTS');
19
34.att. Tabulas EKSPERTS metadatu izguve SQL Developer rīkā
Tabulas tips:
select Table_name, table_type from user_all_tables where TABLE_NAME ='EKSPERTS';
35.att. Tabulas EKSPERTS tipa izguve
Objektu metadati:
select Object_name, Object_id, Data_object_id, Object_Type, Created from user_objects where object_name = 'EKSPERTS';
36.att.Objekta EKSPERTS metadatu izguve
20
3 Tabula ar kolekciju
3.1 Tabula KLUBS un KLUBA DARBINIEKI
Iedomāsimies, kā suņu klubos strādā vairāki darbinieki, tātad būtu ērti izveidot tabulu, kurā
glabāsies kluba nosaukums, reģistrācijas numurs, adrese un tabula ar kluba darbiniekiem jeb tabula
no PERSONA tipa objektiem. Tātad izveidosim jaunu tipu TIPS_PERSONAS – tabulu no
PERSONA tipa objektiem, kas tabulā KLUBS būs kā kolekcija.
Tabulas KLUBS struktūraID Kluba
nosaukums
Reģistrācijas
numurs
Adrese Kluba darbinieki
1 Dog Show 245542 Ļaudonas iela
25
ID VAR UZV PK VALSTS DZIMUMS
1 Anda ... ... ... ...
2 Suns ir mans
draugs
5653215 Meža iela 35 ID VAR UZV PK VALSTS DZIMUMS
2 Olga ... ... ... ....
Create or replace type TIPS_PERSONAS as Table of PERSONA;
37.att. Tips PERSONAS izveidots
21
create table KLUBS(KLUBS_ID NUMBER PRIMARY KEY,NOSAUKUMS VARCHAR2(30),
REG_NR VARCHAR2(20),ADRESE VARCHAR2(35),DARBINIEKI TIPS_PERSONAS)nested table DARBINIEKI store as KLUBS_DARBINIEKI;
38.att. Tabulas KLUBS veidošana SQL+
CREATE SEQUENCE KLUBS_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
Ievietosim tabulā par klubiem Dog Show un Suns ir mans draugs.
INSERT INTO KLUBS VALUES(KLUBS_VIRKNE.NEXTVAL,'DOG SHOW', '245542',
'Laudonas iela 25',TIPS_PERSONAS(
PERSONA('Janis','Liepa','120395-13522','Latvija','viriesu'),PERSONA('Juris','Priede','250986-10987','Igaunija','viriesu'),PERSONA('Inga','Koks','150472-12232','Latvija','sieviesu')
));
39.att. Datu ievietošana tabulā KLUBS
INSERT INTO KLUBS VALUES(KLUBS_VIRKNE.NEXTVAL,'SUNS IR MANS DRAUGS', '5653215', 'Meza iela 35',
22
TIPS_PERSONAS(PERSONA('Ainars','Ozols','120795-12592','Latvija','viriesu'),PERSONA('Alla','Zalite','010986-10258','Igaunija','sieviesu'),PERSONA('Vladislavs','Paparde','150596-16895','Latvija','viriesu')
));
40.att. Datu ievietošana tabulā KLUBS
Izpildām COMMIT komandu. Tagad izmantojot funkciju TABLE iegūsim datus par klubu
darbiniekiem.
select A.Nosaukums, B.UZV, B.VAR, B.VALSTSfrom KLUBS A, Table(A.DARBINIEKI) B;
41.att. Dati par klubu darbiniekiem
Mēģināsim izgūt datus par kluba DOG SHOW darbiniekiem kā objektus.
select A.*, B.*from KLUBS A, Table(A.DARBINIEKI) Bwhere A.Nosaukums = 'DOG SHOW';
42.att. Dati par kluba darbiniekiem objektu veidā
Izvadīsim tikai darbinieku uzvārdus.
23
Select A.Nosaukums, B.UZVfrom KLUBS A, Table(A.DARBINIEKI) B;
43.att. Funkcija TABLE()
METADATI
Tabulas metadati:
Izvadīsim metadatus tabulām KLUBS un KLUBS_DARBINIEKI.
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPEFROM ALL_TAB_COLUMNS WHERE TABLE_NAME IN ('KLUBS','KLUBS_DARBINIEKI');
44.att. Metadatu izguve tabulām KLUBS un KLUBS_DARBINIEKI
Tabulas KLUBS kolonnas DARBINIEKI tips ir izveidotais tips TIPS_PERSONAS.
Redzam, ka tabulai KLUBS_DARBINIEKI metadati netiek attēloti, arī SQL developer rīkā nevar
noskaidrot par to nekādu informāciju.
45.att. Tabulas KLUBS_DARBINIEKI metadati
24
4 Tabula ar heterogeniem objektiem
4.1 Tipu hierarhija. Tabulas CAC un CACIB EKSPERTI
Darbā ir dažas tabulas ar ļoti līdzīgu struktūru – saimnieks, hendleris un eksperts. Mums
ir definēts tips PERSONA, kas satur tabulu kopīgus atribūtus. Pārveidosim to par tipu PERSONA1,
kam iespējami pēcteči, pieliekot rindiņu NOT FINAL.
CREATE or REPLACE TYPE PERSONA1 as OBJECT(VAR VARCHAR2(15),UZV VARCHAR2(20),PK VARCHAR2(20),VALSTS VARCHAR2(20),DZIMUMS VARCHAR2(12))NOT FINAL;
Izstāžu eksperti arī ir personas tipa objekti, bet papildus PERSONA tipa laukiem
nepieciešams norādīt eksperta sertifikāta numuru. Ekspertus iespējams sadalīt sīkāk, visi eksperti
var tiesāt CAC līmeņa (jeb valsts mēroga) iztādes, bet daži no viņiem arī CACIB izstādes
(starptautiskās). Tāpēc izveidosim apakštipu EKSPERTS_CAC (tie ir visi eksperti), kam iespējami
apakštipi.
CREATE or REPLACE TYPE EKSPERTS_CAC under PERSONA1(SERT_NR VARCHAR2(15))NOT FINAL;
Savukārt, CAC ekspertiem, kam ir tiesības piedalīties CACIB līmeņa izstādēs, papildus
sertifikāta numuram nepieciešams norādīt arī CACIB diploma numuru. Tipam EKSPERTS_CACIB
nav iespējami apakštipi.
CREATE or REPLACE TYPE EKSPERTS_CACIB under EKSPERTS_CAC(DIPLOMS_NR VARCHAR2(15));
Tagad objekti ir izveidoti, veidojam tabulu EKSPERTI un aizpildām to ar ierakstiem –
ievadām CAC ekspertus.
create table EKSPERTI of PERSONA1;
insert into EKSPERTI values(EKSPERTS_CAC('Eriks','Detlovs','250662-10452','Latvija','viriesu', '256825'));insert into EKSPERTI values(EKSPERTS_CAC('Olga','Kazakova','011283-13698','Lietuva','sieviesu', '259963'));insert into EKSPERTI values(EKSPERTS_CAC('Irina','Klavina','260273-15205','Igaunija','sieviesu', '25698530'));
25
46.att. Tabulas EKSPERTS dati
Ievietosim dažus CACIB ekspertus.
insert into EKSPERTI values(EKSPERTS_CACIB('Kristiana','Kokina','250662-10452','Latvija','sieviesu', '125825', 'AC58963'));insert into EKSPERTI values(EKSPERTS_CACIB('Arturs','Lodkins','250662-10452','Polija','viriesu', '200025', 'GB50063'));insert into EKSPERTI values(EKSPERTS_CACIB('Poļina','Feliksova','250662-10452','Lietuva','sieviesu', '288885', 'LR58960'));
Tagad mums ir tabula ar heterogēniem objektiem (dažādu tipu objekti). Izvadīsim
tabulas objektus ar to tipiem.
Select Value(A) from EKSPERTI A;
47.att. Tabulas EKSPERTI objekti
Tagad izvadīsim objektu konkrētus laukus, piemēram ekspertu uzvārdus un valsti.
Select DISTINCT A.UZV, A.VALSTS from EKSPERTI A;
48.att. Konkrētas informācijas izguve
Ja mēs gribam izvadīt ekspertu uzvārdus un diploma numurus, izmantosim funkciju
TREAT, jo diploma numurs ir definēts tikai CACIB ir ekspertiem.
SELECT TREAT(VALUE(A) as EKSPERTS_CACIB).DIPLOMS_NR AS Diploma_numurs, A.UZV as Uzvards from EKSPERTI A;
26
49.att. Funckija TREAT
Rezultātā redzam, ka tiem ekspertiem, kas nav tipa EKSPERTS_CACIB objekti ir
tukšums kolonnā DIPLOMA_NUMURS, bet uzvārdi tiek attēloti visi, jo vaicājums ir visai tabulai
EKSPERTI.
27
5 Skatu veidošana
Izveidosim tabulu SAIMNIEKS (darba sakumā tika izveidota tabula SAIMNIEKS1, bet
tā bija objektu tabula, kas satur tikai tipa PERSONA objektus, bet mums obligāti nepieciešams
lauks SAIMNIEKS_ID, lai nodrošinātu tabulas saiti ar citām datu bāzes tabulām).
CREATE TABLE SAIMNIEKS(SAIMNIEKS_ID NUMBER PRIMARY KEY,PERS_DATI persona);
Nodrošināsim automātisko numerāciju, izveidojot virkni:
CREATE SEQUENCE SAIMNIEKS_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
Ievietosim tabulā trīs ierakstus:
insert into SAIMNIEKS values(SAIMNIEKS_VIRKNE.NEXTVAL, PERSONA('Alina','Vasilevska','010293-15893','Latvija','sieviesu'));insert into SAIMNIEKS values(SAIMNIEKS_VIRKNE.NEXTVAL, PERSONA('Olga','Petuhova','010583-18563','Lietuva','sieviesu'));insert into SAIMNIEKS values(SAIMNIEKS_VIRKNE.NEXTVAL, PERSONA('Svetlana','Kolosova','150273-17393','Igaunija','sieviesu'));
5.1 Tabula SUNS un skats no vienas tabulas
Izveidosim tabulu SUNS, kas ir nepieciešama, lai attēlotu informāciju par suņiem un
kas ir saistīta ar tabulām HENDLERIS un SAIMNIEKS.
CREATE TABLE SUNS (SUNS_ID NUMBER CONSTRAINT SUNSID PRIMARY KEY,SUNS_VAR VARCHAR2(15) CONSTRAINT SUNSVAR NOT NULL,SUNS_CIPS VARCHAR2(25),SUNS_DZIMDAT VARCHAR2(12),SUNS_SKIRNE VARCHAR2(20),SUNS_KLASE VARCHAR2(12),SUNS_SVARS VARCHAR2(5),ID_SAIMNIEKS CONSTRAINT FKSUNSID1 REFERENCES SAIMNIEKS(SAIMNIEKS_ID),ID_HENDLERIS CONSTRAINT FKSUNSID2 REFERENCES HENDLERIS(HENDLERIS_ID));
Nodrošinām arī dotās tabulas automātisko numerāciju.
CREATE SEQUENCE SUNS_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
Un ievietosim tabulā dažus ierakstus.
28
INSERT INTO SUNS values( SUNS_VIRKNE.NEXTVAL, 'freud', '25688559', '12.03.2014', 'taksis', 'mazulis', '3kg', 1, 1);INSERT INTO SUNS values( SUNS_VIRKNE.NEXTVAL, 'bobiks', '2559659', '12.03.2012', 'bokseris', 'mazulis', '9kg', 1, 2);INSERT INTO SUNS values( SUNS_VIRKNE.NEXTVAL, 'lucky', '25622259', '12.09.2010', 'aitu suns', 'juniors', '13kg', 2, 1);
Izveidosim skatu, kas attēlos īsu informāciju par suņiem – suņa vārdu, šķirni un klasi.
CREATE FORCE VIEW suns_skats(ID,vards,skirne,klase)AS SELECT suns.suns_id, suns.suns_var, suns.suns_skirne, suns.suns_klaseFROM SUNSWITH CHECK OPTION;
50.att. Skata veidošana no vienas tabulas
Skata datus iespējams izvadīt ar SQL komandu:
SELECT * FROM SUNS_SKATS;
51.att. Skata izvade
Skata metadatus jeb tam atbilstoša vaicājuma tekstu iespējams izvadīt:
SELECT TEXT from ALL_VIEWS where VIEW_NAME='SUNS_SKATS';
52.att. Skata metadatu izguve
Mūsu izveidoto skatu iespējams rediģēt, jo pie tā izveidošanas tika ierakstīts WITH
CHECK OPTION, nevis WITH READ ONLY, tāpēc pievienosim skatam informāciju. Jāuzmanās,
lai skatā tiktu iekļauti visi lauki, kas ir obligāti tabulā. Proti, ja skatā nav iekļauts lauks ar čipa
numuru, čipa numurs nedrīkst būt obligāts lauks tabulā SUNS.
29
INSERT INTO SUNS_SKATS values(SUNS_VIRKNE.NEXTVAL, 'Reksis', 'pudelis', 'veterans');
53.att. Datu ievade skatā SUNS_SKATS
Pēc ieraksta pievienošanas vēlreiz izvadām skata datus:
54.att. Skata datu izvade
Un izvadīsim arī tabulas SUNS saturu:
55.att. Tabulas SUNS dati
5.2 Tabulas KONKURSS un PUNKTI. Skats no divām tabulām
Mums jau ir izveidota tabula KONKURSS
CREATE TABLE KONKURSS (KONKURSS_ID NUMBER CONSTRAINT KONKURSSID PRIMARY KEY,KONKURSS_NOS VARCHAR2(15) CONSTRAINT KONKURSSNOS NOT NULL,KONKURSS_LAIKS VARCHAR2(5) CONSTRAINT KONKURSSLAIKS NOT NULL);
Nodrošinām ierakstu numerāciju:
CREATE SEQUENCE KONKURSS_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
Un ievietojam tabulā trīs ierakstus.
insert into KONKURSS values(KONKURSS_VIRKNE.NEXTVAL, 'Labakais suns', '12:00');insert into KONKURSS values(KONKURSS_VIRKNE.NEXTVAL, 'Gudrs suns', '13:00');insert into KONKURSS values(KONKURSS_VIRKNE.NEXTVAL, 'Paklausigakais', '12:00');
Izveidosim tabulu PUNKTI, kurai arī nodrošinām automātisko ierakstu numerāciju un
ievietojam tajā dažus ierakstus.
30
CREATE TABLE PUNKTI(PUNKTI_ID NUMBER CONSTRAINT PUNKTIID PRIMARY KEY,PUNKTI_SKAITS VARCHAR2(15) CONSTRAINT PUNKTISKAITS NOT NULL,ID_KONKURSS NUMBER CONSTRAINT SAITEKONK REFERENCES KONKURSS(KONKURSS_ID));
CREATE SEQUENCE PUNKTI_VIRKNESTART WITH 1MINVALUE 1MAXVALUE 999;
insert into PUNKTI values(PUNKTI_VIRKNE.NEXTVAL, '150', 1);insert into PUNKTI values(PUNKTI_VIRKNE.NEXTVAL, '250', 2);insert into PUNKTI values(PUNKTI_VIRKNE.NEXTVAL, '200', 2);
Un tagad izveidosim skatu, kas attēlos informāciju par to, kādus punktus suņi ieguvuši
katrā no konkursiem. Dotajā piemērā skatā nav iekļauti vairāki tabulu KONKURSS un PUNKTI
obligātie lauki (kas ir atzīmēti ar NOT NULL), tāpēc nevaram izmantot skatu informācijas
pievienošanai, līdz ar to izvēlāmies READ ONLY opciju.
CREATE FORCE ViEW konkurss_punkti(Konkursa_nosaukums, Punkti)AS SELECT konkurss.konkurss_nos, punkti.punkti_skaitsFROM konkurss, punktiWHERE (konkurss.konkurss_ID=punkti.ID_KONKURSS)WITH READ ONLY;
56.att. Skata no divām tabulām veidošana
SQL developer rīkā var redzēt, ka skats ir izveidots un tas satur informāciju par to, kādi
punkti ir iegūti konkursos.
57.att. Skata dati
31
Skata saturu var attēlot arī ar SQL komandas palīdzību:
SELECT * FROM KONKURSS_PUNKTI;
58.att. Skata datu izvade
Iegūsim arī skata metadatus:
SELECT TEXT from ALL_VIEWS where VIEW_NAME='KONKURSS_PUNKTI';
59.att. Skata metadati
5.3 Objekta skats
Mums jau tika definēts tips PERSONA:
CREATE or REPLACE TYPE PERSONA as OBJECT(VAR VARCHAR2(15),UZV VARCHAR2(20),PK VARCHAR2(20),VALSTS VARCHAR2(20),DZIMUMS VARCHAR2(12));
Definēsim tabulu PERSONAS, kas satur tādus pašus laukus kā tips PERSONA:
CREATE TABLE PERSONAS(VAR VARCHAR2(15),UZV VARCHAR2(20),PK VARCHAR2(20),VALSTS VARCHAR2(20),DZIMUMS VARCHAR2(12));
Ievietosim tabulā dažus ierakstus:
insert into PERSONAS values('Alina','Vasilevska','010293-15893','Latvija','sieviesu');
32
insert into PERSONAS values('Olga','Petuhova','010583-18563','Lietuva','sieviesu');insert into PERSONAS values('Svetlana','Kolosova','150273-17393','Igaunija','sieviesu');
Tagad izveidosim objekta skatu, proti, veidosim no tabulas ierakstiem objektus.
create view PERSONA_skats of PERSONAWITH OBJECT ID(UZV) AsSelect A.VAR, A.UZV, A.PK, A.VALSTS, A.DZIMUMSFROM PERSONAS A;
Tagad attēlosim skata datus, lai pārbaudītu, vai mums izdevās to saistīt ar tabulas
PERSONAS ierakstiem.
select * from PERSONA_skats;
60.att. Skata datu izguve
Tagad mēģināsim pārliecināties, ka tika izveidoti objekti, izgūsim objektus no skata
PERSONAS_SKATS:
select Value(A) from PERSONA_SKATS A;
61.att. Objektu izguve no skata
Izgūsim arī objektu atsevišķu lauku vērtības – tikai personu vārdus un uzvārdus.
Select Value(A).VAR, Value(A).UZV from PERSONA_skats A;
33
62.att. Objekta atsevišķu lauku vērtību izguve
Skata izveidošana ļauj mums izvadīt informāciju objektu veidā un darboties ar
ierakstiem kā ar objektiem, neskatoties uz to, ka objektu tabula netika veidota.
5.4 Objektu skatu hierarhija
Darbā jau tika izveidota tipu hierarhija, līdzīgi iespējams veidot arī skatu hierarhiju. Ir
tabula PERSONAS:
CREATE TABLE PERSONAS(TYPEID number,VAR VARCHAR2(15),UZV VARCHAR2(20),PK VARCHAR2(20),VALSTS VARCHAR2(20),DZIMUMS VARCHAR2(12));
Ir skats PERSONA_skats:
create view PERSONA_skats of PERSONAWITH OBJECT ID(UZV) AsSelect A.VAR, A.UZV, A.PK, A.VALSTS, A.DZIMUMSFROM PERSONAS AWHERE TYPEID=1;
Izveidosim dotajam skatam apakšskatu:
create view EKSPERTI_skats of EKSPERTI_CAC UNDER PERSONA_SKATSWITH OBJECT ID(UZV) asSelect A.VAR, A.UZV, A.PK, A.VALSTS, A.DZIMUMSFROM PERSONAS AWHERE TYPEID=2;
63.att. Skata hierarhijas veidošana
Tika izveidots skats tipam EKSPERTI_CAC, kas ir apakštips tipam PERSONA1 un līdz
34
ar to izveidotais skats ir skata EKSPERTI_skats apakšskats.
35
6 Objekta atsauču 1:N veidošana
6.1 Tabulas SUNU CENTRS
Vienkāršības labad iedomāsimies, ka visi apskatītie suņu centri ir mazi un tajā ir tikai
viens pasniedzējs-hendleris (reālajā dzīvē tādi centri tiešām eksistē, bet to ir ļoti maz), un hendleris
var apmācīt suņus vairākos suņu centros (pirmdien vienā, trešdien kādā citā utt.). Apskatītu situāciju
var modelēt ar saiti viens pret daudziem, jo viens hendleris var pasniegt vairākos centros, bet katrā
centrā ir tikai viens pasniedzējs-hendleris. Izveidosim tipu SUNU_CENTRS:
CREATE or REPLACE TYPE SUNU_CENTRS as object(CENTRS_ID number,CENTRS_NOSAUKUMS VARCHAR2(25),DIREKTORS VARCHAR2(30),CENTRS_REG_NR VARCHAR2(30),CENTRS_ADRESE VARCHAR2(40));
Tagad veidojam arī tabulu SUNU_CENTRI no objektiem.
CREATE TABLE SUNU_CENTRI of SUNU_CENTRS;
Ievietojam tabulā datus par dažiem suņu centriem:
beginINSERT INTO SUNU_CENTRI values(1,'Macibas','Ivanovs','25066210452','Krumu iela 25');INSERT INTO SUNU_CENTRI values(2,'Gudrs suns','Koks','28920633652','Priedes iela 25');INSERT INTO SUNU_CENTRI values(3,'DOG','Ivanok','25060000052','Katlu iela 5');INSERT INTO SUNU_CENTRI values(4,'Smart dog','Kokins','28920889252','Meza iela 2');end;
Izveidojam tipu atsaucei, kas savienos Hendlerus ar suņu centriem.
CREATE or REPLACE TYPE ATSAUCE as object(ATSAUCE_ID number,A_CENTRS REF SUNU_CENTRS);
Izveidosim tabulu, kurā glabāsies atsauces:
CREATE or REPLACE TPE ATSAUCES as tabele of ATSAUCE;
Mums jau ir definēta tabula HENDLERIS ar PERSONA tipa objektiem, izmainīsim to
pievienojot atsauci uz suņu centru, kurā hendleris strādā:
CREATE TABLE HENDLERIS1(HENDLERIS_ID NUMBER PRIMARY KEY,PERS_DATI persona,C_ATSAUCES ATSAUCES)
36
nested table C_ATSAUCES store as T1;Ievietosim datus tabulā HENDLERIS1, ar atsaucēm saistot tos ar atbilstošajiem suņu
centriem.
declareats1 REF SUNU_CENTRS;ats2 REF SUNU_CENTRS;ats3 REF SUNU_CENTRS;ats4 REF SUNU_CENTRS;beginselect REF(A) into ats1 from SUNU_CENTRI A where A.CENTRS_ID = 1;select REF(A) into ats2 from SUNU_CENTRI A where A. CENTRS_ID = 2;insert into HENDLERIS1 values(1, Persona('Igors','Ivanovs','250662-10452','Krievija','viriesu'), ATSAUCES(ATSAUCE(1, ats1), ATSAUCE(2, ats2)));select REF(A) into ats3 from SUNU_CENTRI A where A.CENTRS_ID = 3;select REF(A) into ats4 from SUNU_CENTRI A where A.CENTRS_ID = 4;insert into HENDLERIS1 values(2, Persona('Inna','Lapse','250662-10452','Latvija','sieviesu'), ATSAUCES(ATSAUCE(3, ats3), ATSAUCE(4, ats4)));end;
Tagad izpildīsim vaicājumu, izmantojot operatoru DEREF:
select A.PERS_DATI.UZV, DEREF(B.A_CENTRS) from HENDLERIS1 A, Table(A.C_ATSAUCES) B;
64.att. Vaicājums ar DEREF
Pēc vaicājuma rezultātiem var redzēt, ka hendleris Ivanovs strādā divos suņu centros
(pirmajā un otrajā) un hendlere Lapse strādā 3. un 4. suņu centros. Informācija par suņu centriem
tika izvadīta objektu veidā, izgūsim konkrētus laukus:
select A.PERS_DATI.UZV, DEREF(B.A_CENTRS).CENTRS_NOSAUKUMSfrom HENDLERIS1 A, Table(A.C_ATSAUCES) B;
65.att. Konkrētu lauku izguve ar DEREF
37
7 Atsauce uz skatu ar funkciju MAKE_REF()
7.1 Tabula SPONSORI
Izveidosim tabulu SPONSORI, kas glabās informāciju par uzņēmumiem, kas ir izstādes
sponsori.
create table SPONSORS(SPONSORS_ID number,SPONSORS_NOSAUKUMS varchar2(25),IEGULDIJUMS number(8,2),Primary key (SPONSORS_ID, SPONSORS_NOSAUKUMS));
Definēsim tipu Sponsora datu glabāšanai:
create or replace type SPONSOR as object (SPONSORS_ID number,SPONSORS_NOSAUKUMS varchar2(25),IEGULDIJUMS number(8,2));
Veidojam skatu no Sponsor tipa objektiem, iekļaujot tajā visus tabulas SPONSORS
datus.
create view SKATS_SPONSORS of SPONSOR with object identifier(SPONSORS_ID, SPONSORS_NOSAUKUMS) as select * from SPONSORS;
select MAKE_REF(SKATS_SPONSORS, 1, 'Koks') from dual;select MAKE_REF(SKATS_SPONSORS, 2, 'Ozols') from dual;
66.att. Atsauce uz skatu ar MAKE_REF
38
8 Objektu funkcijas un operatori vaicājumos
SUBMULTISET [OF]
Operators nosaka vai viena kolekcija ir citas kolekcijas apakškopa. Darba sākumā tika
izveidota tabula KLUBS ar kolekciju:
ID Kluba
nosaukums
Reģistrācijas
numurs
Adrese Kluba darbinieki
1 Dog Show 245542 Ļaudonas iela
25
ID VAR UZV PK VALSTS DZIMUMS
1 Anda ... ... ... ...
2 Suns ir mans
draugs
5653215 Meža iela 35 ID VAR UZV PK VALSTS DZIMUMS
2 Olga ... ... ... ....
Create or replace type TIPS_PERSONAS as Table of PERSONA;
create table KLUBS(KLUBS_ID NUMBER PRIMARY KEY,NOSAUKUMS VARCHAR2(30),
REG_NR VARCHAR2(20),ADRESE VARCHAR2(35),DARBINIEKI TIPS_PERSONAS)nested table DARBINIEKI store as KLUBS_DARBINIEKI;
Ievietosim tabulā vēl vienu klubu, kurā strādās tie paši darbinieki, kā klubā Suns ir
mans draugs un vēl viens cits.
INSERT INTO KLUBS VALUES(KLUBS_VIRKNE.NEXTVAL,'SUNI UNMES', '56452135',
'Meza iela 35',TIPS_PERSONAS(
PERSONA('Vladislavs','Pruds','150596-16895','Latvija','viriesu'),PERSONA('Ainars','Ozols','120795-12592','Latvija','viriesu'),PERSONA('Alla','Zalite','010986-10258','Igaunija','sieviesu'),PERSONA('Vladislavs','Paparde','150596-16895','Latvija','viriesu')
));
Ar SUBMULTISET OF iegūsim nosaukumu tam klubam, kura darbinieki strādā arī
kādā citā klubā, proti viņi ir kāda cita kluba darbinieku kolekcijas apakškolekcija.
SELECT A.NOSAUKUMSFROM KLUBS A, KLUBS B
39
WHERE (A.DARBINIEKI SUBMULTISET OF B.DARBINIEKI) and NOT (A.KLUBS_ID=B.KLUBS_ID);
67.att. SUBMULTISET OF
Redzam, ka iegūts klubs Suns ir mans draugs, jo visi tā darbinieki strādā arī klubā Suni
un mēs.
MEMBER [OF]
Nosaka vai elements (objekts) ir kolekcijas loceklis. Tas nozīmē, ka mēs varam noteikt
klubu, kurā strādādarbinieks Pruds:
SELECT A.NOSAUKUMSFROM KLUBS AWHERE PERSONA('Vladislavs','Pruds','150596-16895','Latvija','viriesu') MEMBER OF DARBINIEKI;
68.att. MEMBER OF
Redzam, ka darbinieks strādā klubā Suni un mēs.
40
IS [NOT] A SET
Nosaka vai kolekcijas elementi atkārtojas vai nē, proti, vai kolekcija sastāv no unikāliem
elementiem. Tā kā mūsu tabulā darbinieki neatkārtojas, jo pietiek ierakstīt katru tikai vienu reizi,
izpildot pirmo vaicājumu mēs neredzēsim neviena kluba nosaukumu, bet izpildot otro izvadīs visus
klubus.
SELECT A.NOSAUKUMSFROM KLUBS AWHERE A.DARBINIEKI IS NOT A SET;
SELECT A.NOSAUKUMSFROM KLUBS AWHERE A.DARBINIEKI IS A SET;
69.att. IS NOT A SET un IS A SET
CARDINALITY()
Atgriež masīva vai kolekcijas elementu skaitu. Izvadīsim, cik darbinieku ir katrā klubā:
SELECT A.Nosaukums, CARDINALITY(A.DARBINIEKI) as Darbinieku_SkaitsFROM KLUBS A;
70.att. CARDINALITY
41
[ALL] MULTISET EXCEPT()
Atgriež kolekciju ar elementiem, kuri ir pirmajā kolekcijā, bet nav otrajā. Lai izpildītu
vaicājumus ar šo funkciju, izveidosim tabulā vēl vienu kolekciju – cilvēkus, kas ir kluba akcionāri
(parasti tie vienlaicīgi ir arī kluba darbinieki, bet neobligāti):
create table KLUBS(KLUBS_ID NUMBER PRIMARY KEY,NOSAUKUMS VARCHAR2(30),
REG_NR VARCHAR2(20),ADRESE VARCHAR2(35),DARBINIEKI TIPS_PERSONAS,AKCIONARI TIPS_PERSONAS)nested table DARBINIEKI store as KLUBS_DARBINIEKI,nested table AKCIONARI store as KLUBS_AKCIONARI;
Ievietojam tabulā datus par klubiem. Vienā gadījumā akcionāri ir kādi no kluba
darbiniekiem:
INSERT INTO KLUBS VALUES(KLUBS_VIRKNE.NEXTVAL,'SUNI UN MES', '56452135',
'Meza iela 35',TIPS_PERSONAS(
PERSONA('Vladislavs','Pruds','150596-16895','Latvija','viriesu'),PERSONA('Ainars','Ozols','120795-12592','Latvija','viriesu'),PERSONA('Alla','Zalite','010986-10258','Igaunija','sieviesu'),PERSONA('Vladislavs','Paparde','150596-16895','Latvija','viriesu')),
TIPS_PERSONAS(PERSONA('Vladislavs','Pruds','150596-16895','Latvija','viriesu'),PERSONA('Ainars','Ozols','120795-12592','Latvija','viriesu')));
Otrajā gadījumā tie ir citi cilvēki, kas nav kluba darbinieki:
INSERT INTO KLUBS VALUES(KLUBS_VIRKNE.NEXTVAL,'SUNS ir DRAUGS', '56452135',
'Meza iela 5',TIPS_PERSONAS(
PERSONA('Ainars','Ozols','120795-12592','Latvija','viriesu'),PERSONA('Alla','Zalite','010986-10258','Igaunija','sieviesu'),PERSONA('Vladislavs','Paparde','150596-16895','Latvija','viriesu')),
TIPS_PERSONAS(PERSONA('Olegs','Pruds','150576-16895','Latvija','viriesu')));
Tagad izvadīsim tos klubu darbiniekus, kuri nav akcionāri:
SELECT A.Darbinieki MULTISET EXCEPT A.akcionari FROM Klubs A;
42
71.att. MULTISET EXCEPT
[DISTINCT] MULTISET INTERSECT
Tagad izvadīsim tos darbiniekus, kas vienlaicīgi ir arī akcionāri:
SELECT A.Darbinieki MULTISET INTERSECT DISTINCT A.akcionariFROM KLUBS A;
72.att. MULTISET INTERSECT
[DISTINCT] MULTISET UNION()
Tagad apvienosim katra kluba akcionārus un darbiniekus, izslēdzot atkārtojumus, ja tādi ir:
SELECT Nosaukums, A.darbinieki MULTISET UNION DISTINCT A.akcionariFROM klubs A;
43
73.att. MULTISET UNION DISTINCT
POWERMULTISET()
Var izveidot visas iespējamās kolekcijas apakškopas (pa vienam, diviem, trim utt
elementiem). Izveidosim tādas apakškopas kluba Suni un mes kolekcijai darbinieki.
SELECT B.*FROM klubs A, TABLE(POWERMULTISET(A.darbinieki)) BWHERE A.Nosaukums = 'SUNI UNMES';
44
74.att. POWERMULTISET
45
POWERMULTISET_BY_CARDINALITY()
Ar doto funkciju līdzīgi kā iepriekšējā piemērā iespējams iegūt kolekcijas apakškopas, bet
nevis visas iespējamas, bet ar uzdoto kardinalitāti, piemērām, iegūsim kluba Suni un mes darbinieku
kolekcijas apakškopas pa diviem elementiem:
SELECT B.*FROM klubs A, TABLE(POWERMULTISET_BY_CARDINALITY(A.Darbinieki,2)) B WHERE A.Nosaukums = 'SUNI UNMES';
75.att. POWERMULTISET BY CARDINALITY
SET()
Ar doto funkciju iespējams izslēgt dublējošos locekļus kolekcijās, tad nav jāizmanto
DISTINCT operators, netiks uzrādīti dublikāti.
SELECT SET(B.PERSONALS)FROM (SELECT A.DARBINIEKI MULTISET UNION A.AKCIONARI as PERSONALS FROM KLUBS A) B;
46
76.att. SET
47
9 Secinājumi
Pirmā darba ietvaros tika izveidota relāciju-objektu datu bāze, kas sastāv no dažādām
datu glabāšanas struktūrām – rindas tipa objektu tabulas, tabulas ar objektu kolonu, ar objektu
kolekciju un tabulas no heterogēniem objektiem. Visgrūtākais darba posms bija projektēt datu bāzi
tā, lai varētu izveidot visas augstāk minētas struktūras un izpildīt nepieciešamus vaicājumus, tāpēc
darba gaitā izveidotas datu bāzes struktūra nedaudz atšķiras no planota modeļa. Pirms darba
veikšanas ija nepieciešams instalēt Oracle 10g programmatūru un SQL Developer rīku, tas
nesagadāja nekādas problēmas (izmantoju Windows 8 64-biti), vienīgais, bija jāpalaiž Windows XP
saskaņas režīms (Windows XP Compatibility Mode). Problēmas radās palaižot SQL+
komandrindinas interpretatoru, nezināmo iemeslu dēļ tas tika aizvērts uzreiz pēc palaišanas,
internetā atradu informāciju par to, ka jānomaina atrašanas reģions vienā no konfiguracijas datnēm
(nezinu, kā tas ir saistīts ar manu problēmu, bet tas tiešām palīdzēja uzsākt darbu ar SQL+).
Tika pārbaudīts, ka ar objektu tabulu ierakstiem iespējams strādāt gan kā ar objektiem
(ar funkciju VALUE), gan arī kā ar relāciju tabulām (ievietot un izgūt datus līdzīgi kā no relāciju
tabulām). Praksē pielietota funkcija TABLE, kas ļauj no kolekcijām veidot skatu un attēlot
nepieciešamus datus uz ekrāna. Tika izveidoti skati, kas ir kā virtuālas tabulas, kas tiek attēlotas, bet
nekur netiek izveidotas, tāpēc var secināt, ka tas tiešām var samazināt aizņemto atmiņas apjomu un
palielināt ātrdarbību. Interesanti bija izpētīt mantošanas organizāciju objektu tabulās, jo tā,
manuprāt, ir sarežģītāka par mantošanu, kas tika apskatīta iepriekšēja kursa ietvaros. Vienlaicīgi,
šeit mantošanai iespējami dažādi ierobežojumi, izmantojot tiem paredzētas funkcijas. Grūtības
sagādāja atsauču izmantošana, jo bija grūti saprast to būtību un to, kāpēc tās tiek veidotas tik
sarežģītā veidā.
Tika izpildīti vaicājumi, izgūti gan tabulu dati, gan arī to metadati. Es secināju, ka
metadati ir nepieciešami, lai varētu spriest par tabulas struktūru un par to, kādus datus tajā
iespējams ievietot, lai tie tiktu pieņemti un ierakstīti tabulā.
Jāatzīst, ka pagaidām, man nav radusies skaidrā izpratne par objektu-relāciju datu bāzes
izmantošanas praktiskām priekšrocībām, bet ceru, ka nākamajos darbos tas tiks panākts. Darba
rezultātā iepazinu dažādas relāciju-objektu datu bāzes datu glabāšanas struktūras (skatus, vairākus
tabulu veidus) un vaicājumus ar tiem, domāju, ka tas arī bija pirmā darba mērķis.
48