29
OID OID Objektu norādes jeb atsauces (references) a) Tabulu sasaistīšana relāciju datu bāzē (divpusēja saite) b) Tabulu sasaistīšana relāciju –objektu datu bāzē (vienpusēja saite) create or replace type DARBINIEKS as object ( D_NUM number, D_UZV varchar2(50), D_ADRESE REF ADRESE); 000022020885A84AD57A234951B77FBA920DDCC3AD2C84740 0017E4CF6B27DD419A1619558 A_tabula K_1 K_2 K_3 K_4 1 2 B_tabula K_5 K_6 K_7 K_8 2 2 A_tabula K_1 K_2 K_3 K_4 REF REF 1

Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

  • Upload
    hathuan

  • View
    247

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

OID

OID

Objektu norādes jeb atsauces (references)a) Tabulu sasaistīšana relāciju datu bāzē (divpusēja saite)

b) Tabulu sasaistīšana relāciju –objektu datu bāzē (vienpusēja saite)

create or replace type DARBINIEKS as object (D_NUM number,D_UZV varchar2(50),D_ADRESE REF ADRESE);

000022020885A84AD57A234951B77FBA920DDCC3AD2C84740 0017E4CF6B27DD419A1619558

A_tabulaK_1 K_2 K_3 K_4

12

B_tabulaK_5 K_6 K_7 K_8

22

A_tabulaK_1 K_2 K_3 K_4

REFREF

1

Page 2: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Objektu atsauču (REF) pamatjēdzieni

1. REF ir loģiska norāde uz rindas jeb raksta objektu (tikai objektu tabulā).

2. REF ir speciāls iekļauts datu tips.

3. REF un REF kolekcijas realizē 1:1 un 1 : N saites starp objektiem.

4. Deklarējot kolonnas tipu, kolekcijas elementu vai objekta tipa atribūtu kā REF, var to ierobežot, lai tas saturētu tikai norādes uz noteiktu objektu tabulu. Tāda veida REF sauc par redzesloka REF (scoped REF). Tās prasa mazāk vietas glabāšanai un atļauj efektīvāku pieeju, nekā citas REF.

create table DARBINIEKI (D_NUM number,D_UZV varchar2(50),D_ADRESE REF ADRESE scope is TABULA_ADRESES);

6. Ir iespējams, ka objekts identificēts ar REF kļūst nepieejams. Tādas REF nosauc par nerealizējamām (dangling) atsaucēm. Oracle SQL piedāvā predikātu IS DANGLING, lai noteiktu norādes uz šo nosacījumu.

7. Izmantojot objektu atsauces var iegūt datus no objekta uz kuru ir atsauce. Tas tiek veikts ar operatoru DEREF. Var tikt izmantota arī netieša atsauce uz objektu:

create or replace type PERSONA as object (P_NUM number,P_UZV varchar2(50),P_VADITAJS REF PERSONA );

Ja OOO ir objekts, kura tips ir PERSONA, tad OOO.P_VADITAJS.P_UZV norāda uz personas vadītāja objektu un iegūstam vadītāja uzvārdu. Netiešu atsauci var izmantot SQL izteiksmēs, bet nevar – PL/SQL izteiksmēs.

2

Page 3: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

OID

OID

Objektu atsauču jeb norāžu (references) veidošana

1. Objektu tabulas un tabulas ar objektu kolonu un atsauci definēšana

create or replace type FIRMA as object(F_NUM number,F_NOS varchar2(20),F_TELEF varchar2(15));

create table FIRMAS of FIRMA;

create or replace type CILVEKS as object(PERS_KODS char(11),UZV varchar2(20),VAR varchar2(20));

create table DARBINIEKI(D_NUM number Primary Key,DARBINIEKS CILVEKS,DARBA_VIETA REF FIRMA );

insert into FIRMAS values(FIRMA(1, ‘AA’, ‘7111111’));insert into FIRMAS values(FIRMA(2, ‘BB’, ‘7222222’));insert into DARBINIEKI values(1, CILVEKS(‘15117011111’,’Koks’, ‘Juris’), NULL);insert into DARBINIEKI values(2, CILVEKS(‘16127522222’,’Koks’, ‘Rasma’), NULL);insert into DARBINIEKI values(3, CILVEKS(‘11026033333’,’Celms’, ‘Zane’), NULL);

select A.D_NUM, A.DARBINIEKS.VAR, A.DARBINIEKS.UZV, B.F_NOS from DARBINIEKI A, FIRMAS B;

D_NUM DARBINIEKS.VAR DARBINIEKS.UZV F_NOS---------- -------------------- -------------------- ------------------------------------------ 1 Juris Koks AA 1 Juris Koks BB 2 Rasma Koks AA 2 Rasma Koks BB 3 Zane Celms BB 3 Zane Celms AA

REF

REF

3

Page 4: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Objektu atsauču jeb norāžu vērtību ierakstīšanaObjektu identifikatoru (OID) ierakstīšana objektu atsaucēs un vaicājumu veidošana

declareats REF FIRMA;begin

select REF(A) into ats from FIRMAS A where A.F_NUM = 1;update DARBINIEKI B set B.DARBA_VIETA = ats where B.D_NUM =1 or B.D_NUM=2;

select REF(A) into ats from FIRMAS A where A.F_NUM = 2;update DARBINIEKI B set B.DARBA_VIETA = ats where B.D_NUM =3;

end;

Objekta identifikatora OID iegūšana (SELECT REF() INTO ...

Objekta identifikatora ierakstīšana objekta atsaucē

(UPDATE ...

4

Page 5: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Objektu atsauču jeb norāžu izmantošana vaicājumos

select A.D_NUM, DEREF(A.DARBA_VIETA) from DARBINIEKI A;

D_NUM DEREF(A.DARBA_VIETA)(F_NUM, F_NOS, F_TELEF)------------------------------------------------------------------------------------------ 1 FIRMA(1, 'AA', '7111111') 2 FIRMA(1, 'AA', '7111111') 3 FIRMA(2, 'BB', '7222222')

select B.NUM, B.DV.F_NOSfrom (select A.D_NUM as NUM, DEREF(A.DARBA_VIETA) as DV from DARBINIEKI A) B;

NUM DV.F_NOS-------------------------------------- 1 AA 2 AA 3 BB

5

Page 6: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Objektu atsauču 1 : N veidošana (tabula ar kolekciju kolonā un objektu tabula)create or replace type MASINA as object ( M_NUM number, M_NOS varchar2(30) ); create table MASINAS of MASINA; insert into MASINAS values (MASINA (1, ‘Ford’));insert into MASINAS values (MASINA (2, ‘Volvo’));insert into MASINAS values (MASINA (3, ‘SAAB’));insert into MASINAS values (MASINA (4, ‘FIAT’));--------------------------------------------------------------------------------------------------------create or replace type ATSAUCE as object( A_NUM number, A_MASINA REF MASINA); create or replace type ATSAUCES as table of ATSAUCE; create table VADITAJI(V_NUM number Primary key,V_UZV varchar2(30),V_VAR varchar2(30),M_ATSAUCES ATSAUCES)nested table M_ATSAUCES store as T1;

declareats1 REF MASINA;ats2 REF MASINA;ats3 REF MASINA;ats4 REF MASINA;beginselect REF(A) into ats1 from MASINAS A where A.M_NUM = 1;select REF(A) into ats2 from MASINAS A where A.M_NUM = 2;insert into VADITAJI values(1, 'Koks', 'Juris', ATSAUCES(ATSAUCE(1, ats1), ATSAUCE(2, ats2)));select REF(A) into ats3 from MASINAS A where A.M_NUM = 3;select REF(A) into ats4 from MASINAS A where A.M_NUM = 4;insert into VADITAJI values(2, 'Zars', 'Liene', ATSAUCES(ATSAUCE(3, ats3), ATSAUCE(4, ats4))); end;

Tabula VADITAJI

V_NUM V_UZV V_VAR M_ATSAUCES A_NUM A_MASINA

V_NUM V_UZV V_VAR M_ATSAUCES

A_NUM A_MASINA

6

Page 7: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Vaicājumu veikšana (tabula ar kolekciju kolonā un objektu tabula)

select A.V_NUM, DEREF(B.A_MASINA) from VADITAJI A, Table(A.M_ATSAUCES) B;

V_NUM DEREF(B.A_MASINA)(M_NUM, M_NOS)---------------------------------------------------------------------------- 1 MASINA(1, 'Ford') 1 MASINA(2, 'Volvo') 2 MASINA(3, 'SAAB') 2 MASINA(4, 'FIAT')

select A.V_NUM, DEREF(B.A_MASINA).M_NOS from VADITAJI A, Table(A.M_ATSAUCES) B;

V_NUM DEREF(B.A_MASINA).M_NOS---------- ----------------------------------------------------- 1 Ford 1 Volvo 2 SAAB 2 FIAT

select A.V_NUM, DEREF(B.A_MASINA).M_NOS from VADITAJI A, Table(A.M_ATSAUCES) Bwhere DEREF(B.A_MASINA).M_NUM >=2;

V_NUM DEREF(B.A_MASINA).M_NOS------ ---------------------------------------------------- 1 Volvo 2 SAAB 2 FIAT

7

Page 8: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Objektu atsauču 1 : N veidošana (parasta tabula, objektu tabula ar kolekciju un objektu tabula)create or replace type MASINA as object ( M_NUM number, M_NOS varchar2(30) ); create table MASINAS of MASINA; begin insert into MASINAS values (MASINA (1, ‘Ford’));insert into MASINAS values (MASINA (2, ‘Volvo’));insert into MASINAS values (MASINA (3, ‘SAAB’));insert into MASINAS values (MASINA (4, ‘FIAT’));end;----------------------------------------------------------------------------------------------------------------------------

create table VADITAJI(V_NUM number Primary key,V_UZV varchar2(30),V_VAR varchar2(30),ATSAUCE_MAS REF E_ATSAUCES);

----------------------------------------------------------------------------------------------------------------------------create or replace type ATSAUCE as object( A_NUM number, A_MASINA REF MASINA); create or replace type ATSAUCES as table of ATSAUCE; create or replace type E_ATSAUCES as object(ELEM_ATSAUCES ATSAUCES);

create table M_ATSAUCES of E_ATSAUCESnested table ELEM_ATSAUCES store as IEK_TAB;

Tabula VADITAJI

V_NUM V_UZV V_VAR ATSAUCE_MAS

V_NUM V_UZV V_VAR ATSAUCE_MAS

8

Page 9: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Datu ievade (parasta tabula, objektu tabula ar kolekciju un objektu tabula)

declareats1 REF MASINA;ats2 REF MASINA;ats3 REF MASINA;ats4 REF MASINA;beginselect REF(A) into ats1 from MASINAS A where A.M_NUM = 1;select REF(A) into ats2 from MASINAS A where A.M_NUM = 2;insert into M_ATSAUCES values(E_ATSAUCES(ATSAUCES(ATSAUCE(1, ats1), ATSAUCE(2, ats2))));select REF(A) into ats3 from MASINAS A where A.M_NUM = 3;select REF(A) into ats4 from MASINAS A where A.M_NUM = 4;insert into M_ATSAUCES values(E_ATSAUCES(ATSAUCES(ATSAUCE(3, ats3), ATSAUCE(4, ats4))));end;

declareats1 REF E_ATSAUCES;ats2 REF E_ATSAUCES;beginselect REF(A) into ats1 from M_ATSAUCES A, TABLE(A.ELEM_ATSAUCES) B where B.A_NUM = 1;insert into VADITAJI values(1, ' Koks' , ' Juris', ats1);select REF(A) into ats2 from M_ATSAUCES A, TABLE(A.ELEM_ATSAUCES) B where B.A_NUM = 3;insert into VADITAJI values(2, ' Zars' , ' Liene', ats2);end;

9

Page 10: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Vaicājumu veiksana (parasta tabula, objektu tabula ar kolekciju un objektu tabula)

select A.V_NUM, DEREF(A.ATSAUCE_MAS) from VADITAJI A;

V_NUM DEREF(A.ATSAUCE_MAS)(ELEM_ATSAUCES(A_NUM, A_MASINA))------------------------------------------------------------------------------------------------1 E_ATSAUCES(ATSAUCES(ATSAUCE(1, 000022020885A84AD57A234951B77FBA920DD CC3AD2C847400017E4CF6B27DD419A1619558), ATSAUCE(2, 0000220208478094B82EE247F2A 8167B59F95B58 0A2C8474 00017E4CF6B27DD419A1619558))) 2 E_ATSAUCES(ATSAUCES(ATSAUCE(3, 0000220208C6272EDC825245F69A8383835EEB A7D62C847400017E4CF6B27DD419A1619558), ATSAUCE(4, 000022020880EC6498A15E447E823E9E4678807 7342C847400017E4CF6B27DD419A1619558)))

select A.V_NUM, DEREF(B.A_MASINA) from VADITAJI A, TABLE(DEREF(A.ATSAUCE_MAS).ELEM_ATSAUCES) B;

V_NUM DEREF(B.A_MASINA)(M_NUM, M_NOS)--------------------------------------------------------------------------------------- 1 MASINA(1, 'Ford') 1 MASINA(2, 'Volvo') 2 MASINA(3, 'SAAB') 2 MASINA(4, 'FIAT')

select A.V_NUM, DEREF(B.A_MASINA).M_NOS from VADITAJI A, TABLE(DEREF(A.ATSAUCE_MAS).ELEM_ATSAUCES) B;

V_NUM DEREF(B.A_MASINA).M_NOS------------------------------------------------------------------- 1 Ford 1 Volvo 2 SAAB 2 FIAT

10

Page 11: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Funkcija MAKE_REF()MAKE_REF(objektu_tabula, objektu_skats, atslēga)

MAKE_REF izveido atsauci:1) objektu tabulas objektam (rindas objektam);2) objekta skata objektam (rindas objektam)kuru identifikatori veidoti uz primārās atslēgas bāzes.

Atsauces REF izveidošana objektu skata objektiem:

create table DARBINIEKI(D_NUM number,D_UZV varchar2(20),ALGA number(8,2),Primary key (D_NUM, D_UZV));

create or replace type DARBINIEKS as object (D_NUM number,D_UZV varchar2(20),ALGA number(8,2));

create view SKATS_DARBIN of DARBINIEKS with object identifier(D_NUM, D_UZV) as select * from DARBINIEKI;

select MAKE_REF(SKATS_DARBIN, 1, 'Koks') from dual;

MAKE_REF(SKATS_DARBIN, 1, 'KOKS')----------------------------------------------------------------------------------------------------------------------------------000067038A00631BDC93640A06410EBF1D1F99B1C719000000001C260100010002002900000000000F0600810700140100002A0007000A8401FE0000000F02C102044B6F6B73000000000000000000000000000000000000000000000000000000000000000000000000

select MAKE_REF(SKATS_DARBIN, 2, 'Zars') from dual;MAKE_REF(SKATS_DARBIN,2,'ZARS')----------------------------------------------------------------------------------------------------------------------------------000067038A00631BDC93640A06410EBF1D1F99B1C719000000001C260100010002002900000000000F0600810700140100002A0007000A8401FE0000000F02C103045A617273000000000000000000000000000000000000000000000000000000000000000000000000

11

Page 12: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Piemērs objektu atsauču veidošanai un lietošanaiCREATE TYPE ADRESE_T AS OBJECT( IELA VARCHAR2(20), NUMURS NUMBER, PILSETA VARCHAR2(20));

CREATE TYPE PERSONA_T AS OBJECT ( NUM NUMBER, UZV VARCHAR2(15), VAR VARCHAR2(15), ADRESE REF ADRESE_T );

CREATE TABLE Adreses OF ADRESE_T;

CREATE TABLE Personas OF PERSONA_T(ADRESE with ROWID scope IS ADRESES);

INSERT INTO Adreses VALUES(ADRESE_T(‘Stabu’, 70, ‘Rīga’);

INSERT INTO Personas VALUES(1, ‘Koks’, ‘Juris’, NULL);

Objektu saišu norādīšana (tabulu rindu ar objektiem sasaistīšana)DECLARE ats REF ADRESE_T;BEGINSELECT REF(A) INTO ats FROM ADRESES A WHERE A.NUMURS = 70; UPDATE PERSONAS A SET A.ADRESE = ats WHERE A.NUM =1;END;

SELECT A.*,B.* FROM PERSONAS A, ADRESES B;

NUM UZV VAR ADRESE IELA NUMURS PILSETA------------------------------------------------------------------------------------------------------------------------ 1 Koks Juris00002202088F3BF27A318C48D990A9AFB8668BE625DEC8EF0686AF4BCF82580DD8AB6806E Stabu 70 Rīga

12

Page 13: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Piemērs objektu atsauču veidošanai un lietošanai (turpinājums)INSERT INTO PERSONAS VALUES(2, 'Zars', 'Liene', NULL);INSERT INTO PERSONAS VALUES(3, 'Celms', 'Zane', NULL);INSERT INTO ADRESES VALUES(ADRESE_T('Kr.Barona', 21, 'Rīga'));

SELECT A.*, B.* FROM PERSONAS A, ADRESES B;

NUM UZV VAR ADRESE IELA NUMURS PILSETA--------------------------------------------------------------------------------------------------------------------- 1 Koks Juris00002202088F3BF27A318C48D990A9AFB8668BE625DEC8EF0686AF4BCF82580DD8AB68065E Stabu 70 Rīga 2 Zars Liene Stabu 70 Rīga 3 Celms Zane Stabu 70 Rīga 1 Koks Juris00002202088F3BF27A318C48D990A9AFB8668BE625DEC8EF0686AF4BCF82580DD8AB68065E Kr.Barona 21 Rīga 2 Zars Liene Kr.Barona 21 Rīga 3 Celms Zane Kr.Barona 21 Rīga

SELECT A.NUM, B.IELA FROM PERSONAS A, ADRESES B;

NUM IELA---------- -------------------- 1 Stabu 2 Stabu 3 Stabu 1 Kr.Barona 2 Kr.Barona 3 Kr.Barona

SELECT DEREF(A.ADRESE) FROM PERSONAS A;DEREF(A.ADRESE) (IELA, NUMURS, PILSETA)------------------------------------------------------------------- ADRESE_T('Stabu', 70, 'Rīga')

SELECT A.NUM, DEREF(A.ADRESE) FROM PERSONAS A; NUM DEREF(A.ADRESE)(IELA, NUMURS, PILSETA)-------------------------------------------------------------------------------------- 1 ADRESE_T('Stabu', 70, 'Rīga') 2 3

13

Page 14: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Atsauču iegūšanaYou can obtain a REF to a row object by selecting the object from its object table and applying the REF operator. For example, you can obtain a REF to the purchase order with identification number 1000376 as follows: DECLARE Main_ats REF to cilveks_t;SELECT REF(A) INTO Main_atsFROM CILVEKI AWHERE A.ID = 1000376;The query must return exactly one row.

Oracle8 vidē norādes var būt iegūtas tikai rindu objektiem. Katram rindu objektam objektu tabulā sistēma ģenerē un piesaista globālo unikālo identifikatoru. Objektiem, kuri glabājas kolonnā, nav unikāla identifikatora. Parasti, REF vērtība iekļauj objekta unikālo identifikatoru, unikālo identifikatoru saistītu ar objekta tabulu un rindas objekta rindas identifikatoru (ROWID). ROWID izmanto kā priekšā teikšanu (hint), lai nodrošinātu ātrāku pieeju objektam.REF ir loģiskā “norāde” uz rindas objektu. Tas ir Oracle iebūvētais datu tips. REF un REF kolekcijas modelē saites starp objektiem, īpaši daudzi – pret - vienu attiecības, tāda veidā noņemot ārējas atslēgas vajadzību. REF piedāvā vienkāršu mehānismu navigācijai starp objektiem. Var izmantot punkta notāciju, lai sekotu norādei.

CREATE OR REPLACE TYPE CILVEKS_T AS OBJECT(PERS_KODS CHAR(11),UZV VARCHAR2(20),VAR VARCHAR2(20));

CREATE OR REPLACE TYPE FIRMA_T AS OBJECT(F_NUM NUMBER,F_NOS VARCHAR2(20),F_TELEF VARCHAR2(15));

CREATE TABLE DARBINIEKI(D_NUM NUMBER PRIMARY KEY,DARBINIEKS CILVEKS_T,DARBA_VIETA REF FIRMA_T );

BEGININSERT INTO DARBINIEKI VALUES(1, CILVEKS_T(‘15117011111’,’Koks’, ‘Juris’), NULL);INSERT INTO DARBINIEKI VALUES(2, CILVEKS_T(‘16127522222’,’Koks’, ‘Rasma’), NULL);INSERT INTO DARBINIEKI VALUES(3, CILVEKS_T(‘11026033333’,’Celms’, ‘Zane’), NULL);END;

CREATE TABLE FIRMAS OF FIRMA_T;

BEGIN

14

Page 15: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

INSERT INTO FIRMAS VALUES(FIRMA_T(1, ‘AA’, ‘7111111’));INSERT INTO FIRMAS VALUES(FIRMA_T(2, ‘BB’, ‘7222222’));END;

DECLAREats REF FIRMA_T;BEGINSELECT REF(A) INTO ats FROM FIRMAS A WHERE A.F_NUM = 1;UPDATE DARBINIEKI B SET B.DARBA_VIETA = ats WHERE B.D_NUM =1;UPDATE DARBINIEKI B SET B.DARBA_VIETA = ats WHERE B.D_NUM =2;SELECT REF(A) INTO ats FROM FIRMAS A WHERE A.F_NUM = 2;UPDATE DARBINIEKI B SET B.DARBA_VIETA = ats WHERE B.D_NUM =3;END;

Nekorekts saistīto objektu izvades izsaukums:SELECT A.D_NUM, B.F_NUM FROM DARBINIEKI A, FIRMAS B;D_NUM F_NUM----------------------------- 1 1 2 1 3 1 1 2 2 2 3 2

Korekts saistīto objektu izvades izsaukums:SELECT A.D_NUM, DEREF(A.DARBA_VIETA) FROM DARBINIEKI A;D_NUM DEREF(A.DARBA_VIETA)(F_NUM, F_NOS, F_TELEF)------------------------------------------------------------------------------------------ 1 FIRMA_T(1, 'AA', '7111111') 2 FIRMA_T(1, 'AA', '7111111') 3 FIRMA_T(2, 'BB', '7222222')

Var izmantot REF, lai pārbaudītu vai atjaunotu objektu uz kuru tā norāda. Var arī izmantot REF, lai saņemtu objekta kopiju. Var izmainīt REF, lai tā norādītu uz citu tāda paša tipa objektu vai piešķirt tai nulles vērtību.Deklarējot kolonnas tipu, kolekcijas elementu vai objekta tipa atribūtu kā REF, var to ierobežot, lai tas saturētu tikai norādes uz noteiktu objektu tabulu. Tāda veida REF sauc par redzesloka REF (scoped REF). Tie prasa mazāk vietas glabāšanai un atļauj efektīvāku pieeju, nekā citas REF. Zemāk apskatītais piemērs parāda REF izmantošanu.

CREATE TABLE DARBINIEKI(D_NUM NUMBER PRIMARY KEY,DARBINIEKS CILVEKS,DARBA_VIETA REF FIRMA_T SCOPE IS FIRMAS);

15

Page 16: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

REF var būt ievietots objektu tabulā ar noteiktu tipu (piemērā ar tipu FIRMA) vai jebkura noteikta tipa apakštipu. Ja REF objektu tabulā ievietota ar apakštipu, tad kolonna efektīvi tiek ierobežota, lai saturētu norādes tikai uz apakštipa eksemplāriem (un to apakštipiem, ja tādi ir) tabulā.Ir iespējams, ka objekts identificēts ar REF kļūst nepieejams. Tādas REF nosauc par nokārtu (dangling). Oracle SQL piedāvā predikātu IS DANGLING, lai testētu norādes uz šo nosacījumu.

16

Page 17: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Piemērs. Objekti ar atsaucēm (REF) uz citiem objektiem

CREATE TYPE ADRESE_T AS OBJECT( IELA VARCHAR2(20), NUMURS NUMBER, PILSETA VARCHAR2(20));

CREATE TYPE PERSONA_T AS OBJECT ( NUM NUMBER, UZV VARCHAR2(15), VAR VARCHAR2(15), ADRESE REF ADRESE_T );

CREATE TABLE ADRESES OF ADRESE_T;

CREATE TABLE PERSONAS OF PERSONA_T(ADRESE with ROWID scope IS ADRESES);

INSERT INTO ADRESES VALUES(ADRESE_T(‘Stabu’, 70, ‘Rīga’);

INSERT INTO PERSONAS VALUES(1, ‘Koks’, ‘Juris’, NULL);

Objektu saišu norādīšana (tabulu rindu ar objektiem sasaistīšana)DECLAREats REF ADRESE_T;BEGINSELECT REF(A) INTO atsFROM ADRESES AWHERE A.NUMURS = 70;UPDATE PERSONAS ASET A.ADRESE = atsWHERE A.NUM =1;END;PL/SQL procedure successfully completed.

SELECT A.*,B.* FROM PERSONAS A, ADRESES B;

NUM UZV VAR ADRESE IELA NUMURS PILSETA------------------------------------------------------------------------------------------------------------------------ 1 Koks Juris00002202088F3BF27A318C48D990A9AFB8668BE625DEC8EF0686AF4BCF82580DD8AB6806E Stabu 70 Rīga

17

Page 18: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

DEREF operators

Piekļūšanu objektam norādītam ar REF sauc par objekta iegūšana caur norādi (REF dereferencing). Oracle piedāvā DEREF operatoru, lai izdarītu to.Oracle arī piedāvā netieši izteiktu norādi. Piemēram:

CREATE TYPE Cilveks AS OBJECT (vards varchar2(20),vaditajs REF cilvēks);

Ja X attēlo objektu ar tipu cilveks , tad SQL izteiksme: x.vaditajs.vards, sekos norādei no cilvēka X uz citu cilvēku, X vadītāju, un atgriež vadītāja vārdu. (Tāda veida norādes sekošana ir atļauta SQL, bet neviss PL/SQL).Var saņemt REF rindas objektam, izvēloties objektu no objektu tabulas un pielietojot REF operatoru. Piemēram, var dabūt REF cilvēkam, kuram identifikācijas numurs ir 2341:

DECLARE KarRef REF TO Cilveks_tabula;

SELECT REF(p) INTO KarRefFROM Cilveks_tabula pWHERE p.id=2341;

Vaicājumam jāatgriež tieši vienu rindu.Oracle vidē, REF kolonna vai atribūts var būt neierobežots vai ierobežots izmantojot SCOPE frāzi vai attiecīgu ierobežojumu. Kad REF kolonna ir neierobežota, tā var saturēt objektu norādes uz rindas objektiem, kuri glabājas jebkurā ar attiecīgu objektu tipu tabulā.Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās, norāda uz pareiziem un eksistējošiem rindas objektiem. Tāpēc, REF kolonnas var saturēt objektu norādes, kuras nenorāda uz eksistējošo rindas objektu. Tādas REF vērtības norāda kā nokārušas norādes. Pašlaik, Oracle nepieļauj objektu norādes glabāšanu neierobežotās REF kolonnās, kas satur uz primāras atslēgas pamatotu objekta identifikatoru.REF kolonna var būt ierobežota, lai apskatītu tikai specifisku objektu tabulu. Visas REF vērtības glabājamas kolonnā ar SCOPE ierobežojumu, norāda uz rindas objektiem no tabulas, kura bija norādīta SCOPE frāzē. REF vērtības var būt arī nokārušas.REF kolonna var būt ierobežota ar ierobežojumu REFERENTIAL līdzīgu ārējo atslēgu specifikācijai. Tādām kolonnām tiek piešķirti likumi. Objektu norādei, kura glabājama šajā kolonnā , jānorāda uz pareizo un eksistējošo rindas objektu definētā objektu tabulā.V vai Primary Key ierobežojumi, nevar būt definēti REF kolonnām, bet tādām kolonnām var norādīt Not Null ierobežojumu.

18

Page 19: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

Piemērs. Saistīto objektu datu izgūšana (funkcija DEREF)

INSERT INTO PERSONAS VALUES(2, 'Zars', 'Liene', NULL);1 row created.INSERT INTO PERSONAS VALUES(3, 'Celms', 'Zane', NULL);1 row created.INSERT INTO ADRESES VALUES(ADRESE_T('Kr.Barona', 21, 'Rīga'));1 row created.

SELECT A.*, B.* FROM PERSONAS A, ADRESES B;

NUM UZV VAR ADRESE IELA NUMURS PILSETA--------------------------------------------------------------------------------------------------------------------- 1 Koks Juris00002202088F3BF27A318C48D990A9AFB8668BE625DEC8EF0686AF4BCF82580DD8AB68065E Stabu 70 Rīga 2 Zars Liene Stabu 70 Rīga 3 Celms Zane Stabu 70 Rīga 1 Koks Juris00002202088F3BF27A318C48D990A9AFB8668BE625DEC8EF0686AF4BCF82580DD8AB68065E Kr.Barona 21 Rīga 2 Zars Liene Kr.Barona 21 Rīga 3 Celms Zane Kr.Barona 21 Rīga6 rows selected.

SELECT A.NUM, B.IELA FROM PERSONAS A, ADRESES B;

NUM IELA---------- -------------------- 1 Stabu 2 Stabu 3 Stabu 1 Kr.Barona 2 Kr.Barona 3 Kr.Barona6 rows selected.

SELECT DEREF(A.ADRESE) FROM PERSONAS A;DEREF(A.ADRESE) (IELA, NUMURS, PILSETA)------------------------------------------------------------------- ADRESE_T('Stabu', 70, 'Rīga')

SELECT A.NUM, DEREF(A.ADRESE) FROM PERSONAS A; NUM DEREF(A.ADRESE)(IELA, NUMURS, PILSETA)

19

Page 20: Objektu norādes jeb atsauces - Web viewinsert into MASINAS values (MASINA (1, ‘Ford’)); ... Oracle nav pārliecināts par to, ka objektu norādes, kuras glabājas tādās kolonnās,

-------------------------------------------------------------------------------------- 1 ADRESE_T('Stabu', 70, 'Rīga') 2 3

20