distribuirane i objektne baze podataka vežbe, školska 2009/10
DESCRIPTION
Distribuirane i objektne baze podataka vežbe, školska 2009/10. Univerzitet u Beogradu, Matematički fakultet Biljana Stojanović. Objektn o-relacioni model u sistemu DB2 Korisnički tipovi podataka (UDT). čas 0 7. DB2 objektno-relaciona podrška. - PowerPoint PPT PresentationTRANSCRIPT
1
Distribuirane i objektne baze podatakavežbe, školska 2009/10
Univerzitet u Beogradu, Matematički fakultet
Biljana Stojanović
novembar 2009, Biljana Stojanović
2
Objektno-relacioni model u sistemu DB2Korisnički tipovi podataka (UDT)
čas 07
novembar 2009, Biljana Stojanović
3
DB2 objektno-relaciona podrška
novembar 2009, Biljana Stojanović
DB2 obezbeđuje objektno-relacionu podršku kojom se vrši proširenje relacionog modela.
Podrška za: Velike objekte (LOB) Korisnički definisane funkcije (User-defined functions, UDF) Korisnički definisane tipove (User-defined types, UDT)
Varijante UDT-a: UDT distinct tipovi UDT strukturni tipovi Row tipovi podataka Array tipovi podataka Cursor tipovi podataka
Korisnički definisani strukturni tipovi omogućuju trajno smeštanje objekata i uključuju bitna objektno-orijentisana svojstva, kao što su: nasleđivanje definisanje ponašanja objekata upotrebom metoda identifikatori objekata upotreba referenci polimorfizam
novembar 2009, Biljana Stojanović4
Veliki objekti - LOB Veliki objekti imaju mogućnost smeštanja velike
količine podataka. Razlikujemo sledeće LOB tipove: CLOB – Charecter large object type BLOB – Bynary large object type DBCLOB – double-byte charecter large object type Postoje ugrađene funkcije za manipulaciju velikim
objektima. Razvijena je podrška za upotrebu LOB podataka u
klijentskim aplikacijama preko fajlova ili lokatora. Operacije nad velikim objektima su optimizovane
radi poboljšanja performansi.
novembar 2009, Biljana Stojanović5
Veliki objekti – LOB (2) CLOB(nc) – niske promenljive dužine do n jedinica c. c može biti:
‘K’ (1024 znaka, 1≤ n ≤ 2.097.152) ‘M’ (1.048.576 znakova, 1 ≤ n ≤ 2048) ‘G’ (1.073.441.824 znaka, n može biti 1 ili 2)što ukupno omogućava 2.147.483.648 znakova
DBCLOB – slično kao CLOB samo što se znaci predstavljaju pomoću dva umesto jednog bajta (do 1.073.441.823 znaka)
Binarne niske su univerzalni tip podataka – bilo koji niz bajtova. Predstavljaju se upotrebom klauzule FOR BIT DATA iza nekog znakovnog tipa, kao i upotrebom tipa BLOB(nc) koji se koristi na isti način kao i CLOB(nc).
novembar 2009, Biljana Stojanović6
Distinct tipovi Distinct tipovi su korisnički tipovi koji se baziraju
na postojećim ugrađenim tipovima (izvorni tipovi).
Interno, distinct tip ima istu reprezentaciju kao i postojeći tip nad kojim je definisan, ali se oni smatraju zasebnim i nekompatibilnim tipovima.
Na primer, distinct tipovi se mogu koristiti za predstavljanje različitih valuta, kao što su US_Dollar ili Canadian_Dollar. Oba tipa su interno predstaljena kao ugrađeni tipovi nad kojima se definišu date valute. Ako se obe valute definišu tipom DECIMAL, u sistemu će biti reprezentovane kao vrednosti tipa decimal.
novembar 2009, Biljana Stojanović7
Primer Distinct tip može biti baziran na jednom od LOB tipova
ukoliko se koristi za smeštanje velikih objekata (kao što su audio ili video zapisi). CREATE DISTINCT TYPE AUDIO AS BLOB (1M)
Iako AUDIO ima istu reprezentaciju kao BLOB tip, tretira se kao zaseban tip koji nije kompatibilan sa BLOB tipom niti sa bilo kojim drugim tipom.
Ovo omogućava pisanje funkcija specijalno za dati tip AUDIO čime se obezbeđuje da funkcije ne mogu biti primenjene na bilo koji drugi tip.
Restrikcija: Ne mogu svi ugrađeni tipovi da se koriste za definisanje distinct tipova. Na primer, BOOLEAN ili XML ne mogu da se koriste, kao ni ARRAY, ROW ili CURSOR tipovi.
novembar 2009, Biljana Stojanović8
Pogodnosti upotrebe distinct tipova Proširenje (extensibility) - definisanjem novih tipova, može se uvećati
skup raspoloživih tipova za podršku aplikacijama Fleksibilnost (flexibility) - može se definisati ponašanje (semantika) za
novi tip upotrebom korisničkih funkcija (UDF) kako bi se povećala raznolikost tipova raspoloživih u sistemu
Konzistentno ponašanje (consistent behavior) - strogo tipiziranje obezbeđuje da će se distinct tipovi ponašati na odgovarajući način. Garantuje se da se samo funkcije definisane za taj tip mogu primeniti nad njegovim instancama.
Enkapsulacija (encapsulation) - skup funkcija i operatora koji se mogu primeniti nad distinct tipom definišu njegovo ponašanje. Ovim je omogućena fleksibilnost implementacije, jer pokretanje aplikacije ne zavisi od interne reprezentacije distinct tipa.
Performanse (performance) - distinct tipovi su visoko integrisani u sistem za upravljanje bazama podataka. Zbog interne reprezentacije koja je identična ugrađenim tipovima, distinct tipovi poseduju istu efikasnost u pogledu definisanja ugrađenih funkcija, operatora poređenja i indeksa kao i ugrađeni tipovi.
novembar 2009, Biljana Stojanović9
Stroga tipiziranost u distinct tipovima Jedan od najbitnijih koncepata vezanih za distinct tipove jeste
stroga tipiziranost. Stroga tipiziranost garantuje da se jedino funkcije i operatori definisani eksplicitno za distinct tip mogu primeniti nad njegovim instancama.
Stroga tipiziranost je bitna jer omogućava da su instance distinct tipa korektne. Na primer, ako se definiše funkcija koja konvertuje američke dolare u kanadske dolare prema tekućem kursu, ista funkcija ne treba da se koristi za konverziju eura u kanadske dolare jer će se sigurno dobiti pogrešna suma.
Kao posledicia stroge tipiziranosti, DB2 ne dopušta pisanje upita u kojima se porede, na primer, instance distinct tipa i instance njegovog izvornog tipa. Iz istog razloga, DB2 ne dopušta primenu funkcija definisanih za druge tipove nad instancama distinct tipa.
Ako je potrebno porediti instancu distinct tipa sa instancom nekog drugog tipa, neophodno je izvršiti kastovanje instance jednog tipa u drugi tip ili obrnuto.
Slično, neophodno je da se instanca distinct tipa kastuje u tip parametra funkcije koja nije definisana za distinct tip, ukoliko želimo da primenimo tu funkciju nad instancom distinct tipa.
novembar 2009, Biljana Stojanović10
Kreiranje distinct tipa Puna sintaksa naredbe za kreiranje distinct tipa je:CREATE DISTINCT TYPE distinct-type-name AS
source-data-type [WITH COMPARISONS]
source-data-type
built-in type
anchored type
anchored type:
ANCHOR DATA TYPE TO variable-name
[table-name.column-name] Uspešnim izvršenjem naredbe generišu se funkcije kastovanja između
distinct tipa i izvornog tipa, a opciono se generiše podrška za operatore poređenja (=, <>, <, <=, >, >=) za distinct tip.
WITH COMPARISONS – generišu se operatori poređenja za poređenje dve instance distinct tipa. Ne sme da se navodi za LOB, CLOB i DBCLOB tipove, za koje nisu podržani operatori poređenja. Za sve ostale tipove se opciono navodi, mada i u slučaju kada se klauza ne navede, biće generisani operatori poređenja.
novembar 2009, Biljana Stojanović11
Kreiranje distinct tipa (2) distinct-type-name:
ime distinct tipa (sa ili bez kvalifikatora). Ne sme da bude ime postojećeg tipa (ugrađenog ili korisnički definisanog), kao ni BOOLEAN, BINARY ili VARBINARY. Ime ne sme da bude ni ARRAY, INTERVAL ili ROWID.
Ne smeju se koristiti ni ključne reči: SOME, ANY, ALL, NOT, AND, OR, BETWEEN, NULL, LIKE, EXISTS, IN, UNIQUE, OVERLAPS, SIMILAR, MATCH, kao i operatori poređenja.
source-data-type: specifikuje tip koji se koristi kao osnova za internu reprezentaciju
distinct tipa. Tip mora biti ugrađeni tip podataka. Ne sme biti XML ili ARRAY tip (SQLSTATE 42601).
Preporučena imena tipova koje treba koristiti radi prenosivosti aplikacija:
DOUBLE ili REAL umesto FLOAT DECIMAL umesto NUMERIC VARCHAR, BLOB ili CLOB umesto LONG VARCHAR VARGRAPHIC ili DBCLOB umesto LONG VARGRAPHIC
novembar 2009, Biljana Stojanović12
Kreiranje distinct tipa (3) anchored-data-type:
Identifikuje drugi objekat na osnovu kojeg se definiše distinct tip. Važe ista ranije navedena ograničenja i za tip objekta sidra.
ANCHOR DATA TYPE TO – tip drugog objekta (sidra) se koristi za definisanje novog tipa
variable-name – identifikuje globalnu promenljivu ugrađenog tipa različitog od ROW ili CURSOR. Tip promenljive se koristi kao tip na osnovu kojeg se definiše distinct tip.
table-name.column-name: identifikuje ime kolone (atribut) postojeće tabele ili
pogleda, pri čemu tip atributa mora biti neki ugrađeni tip i na osnovu njega se definiše distinct tip.
novembar 2009, Biljana Stojanović13
Generisane funkcije kastovanja Generišu se sledeće funkcije kastovanja:
jedna funkcija za konverziju distinct tipa u izvorni tip i obrnuto jedna funkcija za konverziju tipa INTEGER u distinct tip, ako je izvorni tip SMALLINT jedna funkcija za konverziju tipa VARCHAR u distinct tip, ako je izvorni tip CHAR jedna funkcija za konverziju tipa VARGRAPHIC u distinct tip, ako je izvorni tip
GRAPHIC U opštem slučaju, funkcije imaju sledeći format:
CREATE FUNCTION source-type-name (distinct-type-name)RETURNS source-type-name ...
CREATE FUNCTION distinct-type-name (source-type-name)
RETURNS distinct-type-name ...
U slučajevima kada je izvorni tip parametrizovan, funkcija konverzije distinct tipa u izvorni tip ima ime izvornog tipa bez parametara. Tip povratne vrednosti funkcije uključuje parametre zadate u CREATE TYPE naredbi. Funkcija za konverziju izvornog tipa u distinct tip ima ulazni parametar izvornog tipa uključujući i parametre.
novembar 2009, Biljana Stojanović14
Primer 1 Naredbe:CREATE TYPE T_SHOESIZE AS CHAR(2)
WITH COMPARISONS
CREATE TYPE T_MILES AS DOUBLE
WITH COMPARISONS
generišu sledeće funkcije: FUNCTION CHAR ( T_SHOESIZE) RETURNS CHAR (2)
FUNCTION T_SHOESIZE ( CHAR (2) )
RETURNS T_SHOESIZE
FUNCTION DOUBLE (T_MILES) RETURNS DOUBLE
FUNCTION T_MILES (DOUBLE) RETURNS T_MILES
novembar 2009, Biljana Stojanović15
Tabela funkcija konverzije
novembar 2009, Biljana Stojanović16
Tabela funkcija konverzije (2)
novembar 2009, Biljana Stojanović17
Funkcije navedene u tabeli su jedine funkcije koje
se automatski generišu prilikom kreiranja distinct tipa. Dakle, ni jedna od ugrađenih funkcija (AVG, MAX, LENGTH itd) nije podržana za distinct tip, sve dok se naredbom CREATE FUNCTION ne izvrši registracija ovih funkcija za distinct tip, pri čemu će te funkcije biti bazirane na odgovarajućim ugrađenim funkcijama.
Ove funkcije su osnovne za manipulaciju distinct tipovima u upitima.
Već definisani distinct tipovi ne mogu da se koriste kao izvorni tipovi za druge distinct tipove, to mogu biti samo ugrađeni tipovi.
novembar 2009, Biljana Stojanović18
Kreiranje tabela sa kolonama distinct tipa Nakon kreiranja, distinct tip se može upotrebiti za definisanje
kolona u naredbi CREATE TABLE. CREATE DISTINCT TYPE T_EDUC AS SMALLINT WITH
COMPARISONS WITH COMPARISONS mora da se zada jer je izvorni tip SMALLINT.
CREATE TABLE EMPLOYEE (EMPNO CHAR(6) NOT NULL,
FIRSTNAME VARCHAR(12) NOT NULL,
LASTNAME VARCHAR(15) NOT NULL,
WORKDEPT CHAR(3),
PHONENO CHAR(4),
PHOTO BLOB(10M) NOT NULL,
EDLEVEL T_EDUC)
novembar 2009, Biljana Stojanović19
Uklanjanje korisničkih tipova Za uklanjanje korisničkih tipova (UDT) koristi
se DROP naredba. Ne može se ukloniti UDT ako se koristi:
Za definiciju kolone postojeće tabele ili pogleda Kao tip postojeće tipizirane tabele ili tipiziranog
pogleda Kao nadtip nekog drugog strukturnog tipa SUBP pokušava da ukloni svaku rutinu koja zavisi
od uklonjenog tipa. Ne može biti uklonjena ako pogled, triger, provera ograničenja za tabelu (check constraint) ili neka druga rutina zavise od nje. Ako DB2 ne može da ukloni zavisnu rutinu, neće ukloniti ni odgovarajući tip.
novembar 2009, Biljana Stojanović20
Primer 2CREATE DISTINCT TYPE US_DOLLAR AS DECIMAL (9,3) WITH COMPARISONS CREATE DISTINCT TYPE CANADIAN_DOLLAR AS DECIMAL (9,3) WITH COMPARISONSCREATE DISTINCT TYPE EURO AS DECIMAL (9,3) WITH COMPARISONS
CREATE TABLE US_SALES (PRODUCT_ITEM INTEGER, MONTH INTEGER CHECK (MONTH BETWEEN 1 AND 12), YEAR INTEGER CHECK (YEAR > 1985), TOTAL US_DOLLAR) CREATE TABLE CANADIAN_SALES (PRODUCT_ITEM INTEGER, MONTH INTEGER CHECK (MONTH BETWEEN 1 AND 12), YEAR INTEGER CHECK (YEAR > 1985), TOTAL CANADIAN_DOLLAR) CREATE TABLE GERMAN_SALES (PRODUCT_ITEM INTEGER, MONTH INTEGER CHECK (MONTH BETWEEN 1 AND 12), YEAR INTEGER CHECK (YEAR > 1985), TOTAL EURO)
novembar 2009, Biljana Stojanović21
Primer 3 Može se definisati distinct tip za reprezentaciju konkursnih formulara kandidata u
tabelama, kao i za reprezentaciju parametara funkcija. CREATE DISTINCT TYPE PERSONNEL.APPLICATION_FORM AS CLOB(32K) Pošto DB2 ne podržava poređenje nad tipom CLOB, ne može da se zada
klauzulaWITH COMPARISONS. Ime sheme (PERSONNEL) se navodi jer shema treba da sadrži sve distinct tipove i sve korisničke funkcije koje se koriste u radu sa formularima.
Dalje, može se kreirati tabela u kojoj se čuvaju formulari popunjeni od strane kandidata. CREATE TABLE APPLICATIONS
(ID SYSIBM.INTEGER,
NAME VARCHAR (30),
APPLICATION_DATE SYSIBM.DATE,
FORM PERSONNEL.APPLICATION_FORM) Distinct tip je kvalifikovan imenom sheme, jer njegov kvalifikator nije isti kao
autorizacijski ID. Kad god imena tipova i funkcija nisu kvalifikovana, DB2 pretražuje sheme koje su
navedene na lokaciji koja odgovara tekućoj putanji funkcija, tražeći tip ili funkciju koja odgovara datom nekvalifikovanom imenu.
Pošto se SYSIBM uvek uzima u obzir (ako se izostavi) u tekućoj putanji, može se za ugrađene tipove izostaviti kvalifikacija.
novembar 2009, Biljana Stojanović22
Primer 4 – kastovanje između distinct tipova Želimo da definišemo funkciju koja konvertuje neku valutu u US dolar. CREATE TABLE exchange_rates
(source CHAR(3), target CHAR(3), rate DECIMAL(9,3)) Sledeća funkcija se može iskoristiti za direktni pristup vrednostima tabele CREATE FUNCTION exchange_rate(src VARCHAR(3), trg VARCHAR(3))
RETURNS DECIMAL(9,3)
RETURN SELECT rate FROM exchange_rates
WHERE source = src AND target = trg U prethodnoj funkciji vrednost kursa je tipa DECIMAL, nije distinct tipa. Za
predstavljanje različitih valuta, mogu se koristiti distinct tipovi: CREATE DISTINCT TYPE CANADIAN_DOLLAR AS DECIMAL (9,3) WITH COMPARISONS
CREATE DISTINCT TYPE EURO AS DECIMAL(9,3) WITH COMPARISONS
CREATE DISTINCT TYPE US_DOLLAR AS DECIMAL (9,3) WITH COMPARISONS
novembar 2009, Biljana Stojanović23
Primer 4 - nastavak Za definisanje funkcije koja konvertuje kanadski dolar
ili euro u US dolar, moraju da se kastuju vrednosti koje se koriste. CREATE FUNCTION US_DOLLAR_C(amount CANADIAN_DOLLAR)
RETURNS US_DOLLAR
RETURN US_DOLLAR(DECIMAL(amount) * exchange_rate('CAN', 'USD'))
CREATE FUNCTION US_DOLLAR_E(amount EURO)
RETURNS US_DOLLAR
RETURN US_DOLLAR(DECIMAL(amount) * exchange_rate('EUR', 'USD'))
novembar 2009, Biljana Stojanović24
Poređenja upotrebom distinct tipova Pretpostavimo da želimo da odredimo koji proizvodi su se više prodali u Americi
nego u Kanadi i Nemačkoj za mesec Jul, 2009. godine. SELECT US.PRODUCT_ITEM, US.TOTAL
FROM US_SALES AS US, CANADIAN_SALES AS CDN,
GERMAN_SALES AS GERMAN
WHERE US.PRODUCT_ITEM = CDN.PRODUCT_ITEM
AND US.PRODUCT_ITEM = GERMAN.PRODUCT_ITEM
AND US.TOTAL > US_DOLLAR_C (CDN.TOTAL)
AND US.TOTAL > US_DOLLAR_E (GERMAN.TOTAL)
AND US.MONTH = 7
AND US.YEAR = 2009
AND CDN.MONTH = 7
AND CDN.YEAR = 2009
AND GERMAN.MONTH = 7
AND GERMAN.YEAR = 2009 Pošto ne može da se direktno vrši poređenje US dolara sa kanadskim dolarima ili
eurima, koriste se funkcije za kastovanje sume novca iz kanadskih dolara u US dolare i iz eura u US dolare. Ne bi trebalo da se sve sume kastuju u DECIMAL i da se potom porede, zato što sume nisu monetno uporedive, tj. dobijene sume nisu u istoj valuti.
novembar 2009, Biljana Stojanović25
Poređenje distinct tipova i konstanti Pretpostavimo da želimo da znamo koji proizvodi su se prodali za više od
$100 000.00 u Americi za mesec Jul, 2009 godine. SELECT PRODUCT_ITEM
FROM US_SALES
WHERE TOTAL > US_DOLLAR (100000)
AND month = 7
AND year = 2009 Pošto ne mogu direktno da se porede US dolari sa instancama izvornog tipa
za US dolare, što je DECIMAL, koristi se funkcija za kastovanje DECIMAL u US dolare. Takođe, može se koristiti i druga funkcija za kastovanje koju obezbeđuje DB2 (US dolari u DECIMAL) za kastovanje kolone total u DECIMAL.
Može se koristiti i notacija kastovanja umesto poziva funkcije za kastovanje. SELECT PRODUCT_ITEM FROM US_SALES
WHERE TOTAL > CAST (100000 AS us_dollar)
AND MONTH = 7
AND YEAR = 2009
novembar 2009, Biljana Stojanović26
Dodele vrednosti upotrebom distinct tipova u ugrađenom SQL-uEXEC SQL BEGIN DECLARE SECTION;
SQL TYPE IS CLOB(32K) hv_form;
EXEC SQL END DECLARE SECTION;
...
INSERT INTO APPLICATIONS
VALUES (134523, 'Peter Holland', CURRENT DATE, :hv_form) Ne mora eksplicitno da se poziva funkcija za kastovanje host promenljive u distinct tip
personnal.application_form. Pretpostavimo da su definisane tri funcije nad ugrađenom funkcijom SUM da bi se
podržala funkcija SUM za US dolare, kanadske dolare i eure. CREATE FUNCTION SUM (CANADIAN_DOLLAR)
RETURNS CANADIAN_DOLLAR
SOURCE SYSIBM.SUM (DECIMAL())
CREATE FUNCTION SUM (US_DOLLAR)
RETURNS US_DOLLAR
SOURCE SYSIBM.SUM (DECIMAL())
CREATE FUNCTION SUM (US_DOLLAR)
RETURNS US_DOLLAR
SOURCE SYSIBM.SUM (DECIMAL())
novembar 2009, Biljana Stojanović27
Pretpostavimo da je potrebno održavati godišnje ukupne vrednosti
prodaje u US dolarima za svaki proizvod u svakom regionu, u posebnim tabelama:
CREATE TABLE US_SALES_94
(PRODUCT_ITEM INTEGER,
TOTAL US_DOLLAR)
CREATE TABLE GERMAN_SALES_94
(PRODUCT_ITEM INTEGER,
TOTAL US_DOLLAR)
CREATE TABLE CANADIAN_SALES_94
(PRODUCT_ITEM INTEGER,
TOTAL US_DOLLAR)
INSERT INTO US_SALES_94
SELECT PRODUCT_ITEM, SUM (TOTAL)
FROM US_SALES
WHERE YEAR = 1994
GROUP BY PRODUCT_ITEM
novembar 2009, Biljana Stojanović28
INSERT INTO GERMAN_SALES_94 SELECT PRODUCT_ITEM, US_DOLLAR_E (SUM (TOTAL))
FROM GERMAN_SALES
WHERE YEAR = 1994
GROUP BY PRODUCT_ITEM
INSERT INTO CANADIAN_SALES_94
SELECT PRODUCT_ITEM, US_DOLLAR_C (SUM (TOTAL))
FROM CANADIAN_SALES
WHERE YEAR = 1994
GROUP BY PRODUCT_ITEM Eksplicitno se konvertuje suma u kanadskim dolarima i eurima u US
dolare, obzirom da se vrednosti različitih distinct tipova ne mogu direktno dodeljivati.
Ne može da se koristi sintaksa cast operatora, jer distinct tipovi mogu jedino da se kastuju u svoje izvorne tipove.
novembar 2009, Biljana Stojanović29
Primena UNION operatora na kolone distinct tipa Pretpostavimo da želimo da kreiramo pogled koji sadrži sve
registrovane prodaje za sve proizvode u kompanijama: CREATE VIEW ALL_SALES AS
SELECT PRODUCT_ITEM, MONTH, YEAR, TOTAL
FROM US_SALES
UNION
SELECT PRODUCT_ITEM, MONTH, YEAR, US_DOLLAR_C (TOTAL)
FROM CANADIAN_SALES
UNION
SELECT PRODUCT_ITEM, MONTH, YEAR, US_DOLLAR_E (TOTAL)
FROM GERMAN_SALES Neophodno je kastovanje kanadskih dolara i eura u američke
dolare, jer su distinct tipovi union kompatibilni jedino sami sa sobom.
novembar 2009, Biljana Stojanović30
Definisanje izvornih funkcija za distinct tipove Pretpostavimo da imamo definisanu izvornu funkciju nad
ugrađenom funkcijom SUM radi primene funkcije SUM nad eurima:
CREATE FUNCTION SUM (EUROS)
RETURNS EUROS
SOURCE SYSIBM.SUM (DECIMAL()) Želimo da odredimo ukupnu prodaju u Nemačkoj za svaki
proizvod za 1994. godinu i to u US dolarima: SELECT PRODUCT_ITEM, US_DOLLAR_E(SUM (TOTAL))
FROM GERMAN_SALES
WHERE YEAR = 1994
GROUP BY PRODUCT_ITEM Ne može da se piše SUM (us_dollar (total)), osim ako nije
definisana funkcija SUM za US dolare na sličan način kao za eure.
novembar 2009, Biljana Stojanović31
Strukturni tipovi Strukturni tipovi su korisnički tipovi koji sadrže jedan ili više imenovanih
atributa odgovarajućeg tipa. Atributi su svojstva koja opisuju instance strukturnog tipa.
Na primer, osoba može imati atribute ime, adresa, i slično. Strukturni tip uključuje i skup specifikacija metoda. Metodima se definiše
ponašanje instanci strukturnog tipa. Slično korisničkim funkcijama (UDF), metodi su rutine koje proširuju SQL. U slučaju metoda, ponašanje je integrisano sa samim tipom. Strukturni tip može da se koristi kao tip tabele, pogleda ili kolone. Tabele i pogledi strukturnog tipa poznati su pod nazivom tipizirane tabele
i pogledi (typed table and views). Imena i tipovi atributa strukturnog tipa postaju imena i tipovi kolona tipiziranih tabela ili pogleda. Redovi se mogu posmatrati kao reprezentacije instanci strukturnog tipa.
Strukturni tip može da se koristi i kao tip argumenata neke rutine. Tip se ne može ukloniti ukoliko ga neki drugi objekti koriste, direktno ili
indirektno. Na primer, tip ne može da se ukloni ukoliko kolona tabele ili pogleda
direktno ili indirektno koristi taj tip.
novembar 2009, Biljana Stojanović32
Kreiranje strukturnih tipova
novembar 2009, Biljana Stojanović33
type-name
ime tipa. Ne sme biti ime već postojećeg tipa (ugrađenog, strukturnog ili distinct tipa).
UNDER supertype-name navodi se ime nadtipa. Tip koji se definiše će sadržati sve
atribute nadtipa praćene dodatnim atributima iz attribute-definition sekcije.
attribute-definition: definicija atributa strukturnog tipa. Ime atributa mora da se
razlikuje od imena ostalih atributa, kao i od imena atributa nadtipa.
Tip atributa može biti bilo koji ugrađeni tip. Ne može biti XML. Ako je tip atributa referentni tip, ciljni tip mora biti postojeći strukturni tip ili onaj koji se kreira ovom naredbom.
Strukturni tip ne može da se definiše tako da neki od njegovih atributa bude istog tipa ili nekog od podtipova.
novembar 2009, Biljana Stojanović34
INSTANTIABLE /NOT INSTANTIABLE – može/ne može se kreirati instanca
strukturnog tipa. NOT INSTANTIABLE
ne generiše se konstruktor za ovakav tip strukturni tip ne može biti tip tabele ili pogleda može se koristiti kao tip kolona tabele (u kolonu se mogu uneti samo null
vrednosti ili instance INSTANTIABLE podtipa) Da bi se kreirale instance NOT INSTANTIABLE strukturnog tipa, moraju se
kreirati INSTANTIABLE podtipivi. INLINE LENGTH integer
maksimalna veličina (u bajtovima) instance kolone strukturnog tipa za smeštanje zajedno sa ostalim vrednostima u redu tabele.
Instance strukturnog tipa ili njegovog podtipa koje su veće od zadate vrednosti, smeštaju se odvojeno od reda tabele (slično kao LOB vrednosti).
Ako je navedena INLINE_LENGTH vrednost manja od veličine rezultata konstruktora novokreiranog tipa i manja od 292 bajta, generiše se greška.
INLINE LENGTH vrednost za strukturni tip (podrazumevana ili zadata) je zapravo vrednost podrazumevane veličine kolona strukturnog tipa. To se može promeniti prilikom kreiranja tabele.
Podrazumevana vrednost za INLINE LENGTH se određuje od strane sistema.
novembar 2009, Biljana Stojanović35
WITHOUT COMPARISONS
Ne generišu se funkcije poređenja za instance strukturnog tipa
NOT FINAL Strukturni tip može da se koristi kao nadtip
MODE DB2SQL Neophodna klauza kojom se omogućava direktan poziv
konstruktora za dati tip. WITH FUNCTION ACCESS
Svim metodima ovog tipa i njegovih podtipova uključujući i metode koji će kasnije biti kreirani, može se pristupiti pomoću funkcijske notacije. Ova opcija se može zadati samo za koreni strukturni tip u hijerarhiji tipova (tj. ako opcija UNDER nije zadata).
novembar 2009, Biljana Stojanović36
REF USING rep-type
Definiše ugrađeni tip koji se koristi kao reprezentacija za referentni tip datog strukturnog tipa i svih njegovih podtipova. Može se zadati samo za koreni tip u hijerarhiji.
Rep-type ne može biti REAL, FLOAT, DECFLOAT, BLOB, CLOB, DBCLOB, nizovski tip, strukturni tip i mora imadi veličinu manju ili jednaku 32 672 bajta.
Ako ova klauza nije navedena za koreni tip hijerarhije, podrazumeva se REF USING VARCHAR(16) FOR BIT DATA
CAST (SOURCE AS REF) WITH funcname1 Definiše ime funkcije generisane od strane sistema koja kastuje
tip rep-type u referentni tip strukturnog tipa. Ako se ne navede klauza, podrazumevana vrednost za funcname1 je type-name, tj. ime strukturnog tipa.
CAST (REF AS SOURCE) WITH funcname2 Definiše ime funkcije generisane od strane sistema koja kastuje
vrednost referentnog tipa za dati strukturni tip u tip rep-type. Ako se ne navede klauza, podrazumevana vrednost za funcname2 je rep-type, tj. ime reprezentacionog tipa.
novembar 2009, Biljana Stojanović37
Kreiranje strukturnih tipova (2)
novembar 2009, Biljana Stojanović38
method-specification
Definiše metode za ovaj tip. Metod ne može da se koristi ako ne postoji naredba CREATE METHOD.
OVERRIDING Metod koji se definiše preklapa metod iz nadtipa. Nije primenljivo na sve metode. Metod koji se definiše i originalni metod moraju imati isto ime, isti broj i tipove parametara.
method-name Može se koristiti isto ime za više metoda, sve dok se njihovi prototipovi razlikuju
parameter-name Ime parametra. Ne može biti SELF, što je ime implicitnog parametra metoda. Ako je u pitanju
SQL metod, svi parametri moraju biti imenovani. Ako metod preklapa metod iz nadtipa, ime parametra mora biti isto kao i u preklopljenom metodu.
data-type2 Tip parametra metoda
Napomena: Ne postoji podrazumevano mapiranje strukturnog tipa u tip matičnog jezika koji se
koristi za pisanje aplikacije. Mora da se definiše funkcija koja će vršiti mapiranje. AS LOCATOR
Za LOB tipove ili distinct tipove bazirane na LOB tipovima. Metodu će se proslediti LOB lokator umesto odgovarajuće vrednosti, čime se štedi na broju bajtova koji se prosleđuju metodu, pogotovo kada je samo nekoliko bajtova vrednosti zapravo bitno za metod.
novembar 2009, Biljana Stojanović39
RETURNS - obavezna klauza, kojom se opisuje rezultat metoda. data-type3 - tip rezultata metoda. Važe ista razmatranja kao i za tip data-type2.
Ako metod preklapa drugi metod, data-type3 mora da bude podtip tipa povratne vrednosti originalnog metoda ukoliko se radi o strukturnom tipu; u suprotnom, tipovi moraju biti identični.
data-type4 cast from data-type5 - tip rezultata metoda. Ova klauza se koristi za vraćanje drugačijeg tipa podataka pozivajućoj naredbi u
odnosu na tip podataka koji vraća metod. Tip 5 mora da ima mogućnost kastovanja u tip 4.
Pošto se veličina i preciznost tipa 4 nasleđuju iz tipa 5, nije neophodno navoditi eksplicitne vrednosti. Umesto toga, može se pisati npr. VARCHAR().
FLOAT() ne može da se koristi. Distinct tip ne može da se koristi za tip 5. Ako metod preklapa drugi metod, ova klauza ne može da se navede. Slično, klauza FOR BIT DATA ne može da se navede.
SPECIFIC specific-name Zadaje se jedinstveno ime instanci metoda koji se definiše. Ovo ime može se
koristiti kada se definiše telo metoda ili prilikom uklanjanja metoda. Ne može se koristiti za poziv metoda.
Ako se ne navede, generiše se automatsko ime u odgovarajućem formatu. SELF AS RESULT
Identifikuje se metod kao metod sa održivim tipom.
novembar 2009, Biljana Stojanović40
Kreiranje strukturnih tipova (3)
novembar 2009, Biljana Stojanović41
SQL-routine-characteristics Zadaju se karakteristike metoda koje će biti definisane upotrebom naredbe CREATE
METHOD. LANGUAGE SQL
metod je napisan na SQL-u sa jednom RETURN naredbom. PARAMETER CCSID
Kodna strana koja se koristi za sve ulazne i izlazne znakovne parametre metoda. DETERMINISTIC
Metod uvek vraća isti rezultat za iste ulazne podatke u uspešnim pozivima. NOT DETERMINISTIC EXTERNAL ACTION ili NO EXTERNAL ACTION READS SQL DATA ili CONTAINS SQL
Koji tip SQL naredbi može da se izvrši u okviru metoda. CALLED ON NULL INPUT INHERIT SPECIAL REGISTERS
Specijalni registri promenljivog sadržaja u metodu nasleđuju svoje inicijalne vrednosti iz okruženja pozivajuće naredbe. Za metod koji se poziva u okviru select naredbe kursora, inicijalne vrednosti se nasleđuju iz okruženja u kome je kursor otvoren.
Za metod koji se poziva u ugnježdenom objektu (kao što je triger ili pogled), inicijalne vrednosti se nasleđuju iz izvršnog okruženja (ne iz definicije objekta).
novembar 2009, Biljana Stojanović42
external-routine-characteristics LANGUAGE – obavezna klauza PARAMETER STYLE PARAMETER CCSID DETERMINISTIC ili NOT DETERMINISTIC FENCED ili NOT FENCED THREADSAFE ili NOT THREADSAFE RETURNS NULL ON NULL INPUT ili CALLED ON NULL INPUT NO SQL, CONTAINS SQL, READS SQL DATA EXTERNAL ACTION ili NO EXTERNAL ACTION NO SCRATCHPAD ili SCRATCHPAD length
Preporučuje se da metodi budu re-entrant, tako da scratchpad zapravo znači da se „čuva stanje“ iz jednog poziva u drugi. (scratchpad – svaštara)
Ako je navedeno SCRATCHPAD, pri prvom pozivu metoda, alocira se memorija za scretchpad koji će biti korišćen od strane metoda.
Podrazumevana veličina je 100 bajtova. Inicijallizuje se na sve null karaktere. Opseg je SQL naredba. Postoji jedan scratchpad po jednoj referenci eksternog
metoda u SQL naredbi.
novembar 2009, Biljana Stojanović43
Dakle, ako je metod X definisan sa ovom opcijom, generisaće se tri
scratchpad-a nakon select naredbe:SELECT A, X..(A) FROM TABLEBWHERE X..(A) > 103 OR X..(1) < 19
Ako je navedena klauza ALLOW PARALLEL, opseg je drugačiji. Ako se metod izvršava na više particija baze, scratchpad će biti dodeljen
na svakoj particiji gde se metod izvršava za svako referisanje metoda u SQL naredbi.
Scratchpad je trajan, tj. njegov sadržaj se čuva između poziva metoda. Sve promene koje načini jedan poziv metoda, biće prisutne u narednom pozivu.
NO FINAL CALL ili FINAL CALL Izvršavanje završni poziv za eksterni metod ili ne. Omogućava oslobađanje
zauzetih sistemskih resursa. Ako je navedena klauza FINAL CALL, dodatni argument se prosleđuje metodu
kojim se specifikuje tip poziva. Tip poziva može biti: Normalni poziv Prvi poziv Poslednji (završni) poziv
novembar 2009, Biljana Stojanović44
Prvi poziv – prvi poziv eksternog metoda za
datu konkretnu referencu metoda u datoj SQL naredbi. To je normalni poziv.
Poslednji poziv – nije normalni poziv. Javlja se u sledećim situacijama: Kraj naredbe - kada je kursor zatvoren (za naredbe
koje koriste kursore) ili kada je naredba izvršena Kraj transakcije – kada se ne javlja normalni
završetak naredbe. Ako se izvši naredba commit dok je kursor sa
opcijom WITH HOLD otvoren, poslednji poziv se vrši kada se kursor zatvara ili na kraju aplikacije.
novembar 2009, Biljana Stojanović45
ALLOW PARALLEL ili DISALLOW PARALLEL
da li da za jednu referencu metoda, poziv metoda treba da bude paralelizovan. U opštem slučaju, izvršenje većine skalarnih metoda treba da bude paralelizovano.
Treba razmotriti sledeće: Da li se svi pozivi metoda završavaju nezavisno jedni od drugih? Ako je
odgovor da, navesti ALLOW PARALLEL Da li svaki poziv metoda ažurira scratchpad, obezbeđujući vrednosti koje su
od interesa narednom pozivu. Ako je odgovor da, navesti DISALLOW PARALLEL ili prihvatiti podrazumevanu opciju.
Da li postoji neka eksterna akcija metoda koja se reflektuje samo na jednu particiju baze? Ako je odgovor da, navesti DISALLOW PARALLEL ili prihvatiti podrazumevanu opciju.
Da li se koristi scratchpad, ali samo da bi se neke skupe inicijalizacione radnje obavile minimalan broj puta? Ako je odgovor da, navesti ALLOW PARALLEL.
Podrazumevana vrednost je ALLOW PARALLEL, osim ako je navedena neka od klauzula: NOT DETERMINISTIC, EXTERNAL ACTION, SCRATCHPAD ili FINAL CALL.
novembar 2009, Biljana Stojanović46
Primeri Kreirati tip za odsek (department)
CREATE TYPE DEPT AS
( DEPT_NAME VARCHAR(20),
MAX_EMPS INT)
REF USING INT
MODE DB2SQL Kreirati hijerarhiju tipova koja se sastoji od tipa za zaposlene i podtipa za
megadžere.CREATE TYPE EMP AS
(NAME VARCHAR(32),
SERIALNUM INT,
DEPT REF(DEPT),
SALARY DECIMAL(10, 2) )
MODE DB2SQL
CREATE TYPE MGR UNDER EMP AS
(BONUS DECIMAL(10, 2))
MODE DB2SQL
novembar 2009, Biljana Stojanović47
Primeri (2) Krirati hijerarhijski tip Adresa. Postoji namera da se adrese koriste kao tipovi
kolona. Nije zadata neposredna dužina, tako da se koristi podrazumevana vrednost. Unutar definicije adresnog tipa enkapsuliran je externi metod koji računa koliko je blizu data adresa u odnosu na ulaznu adresu. Telo metoda se kreira naredbom CREATE METHOD.
novembar 2009, Biljana Stojanović48
Primeri (3) Kreirati tip koji ima ugnježdene atribute strukturnog tipa.
CREATE TYPE PROJECT AS( PROJ_NAME VARCHAR(20),
PROJ_ID INTEGER,
PROJ_MGR MGR,
PROJ_LEAD EMP,
LOCATION ADDR_T,
AVAIL_DATE DATE)
MODE DB2SQL;
Definicija strukturnog tipa kojim je predstavljena osoba, sa atributima godine i adredsa:CREATE TYPE Person_t AS
(Name VARCHAR(20), Age INT, Address Address_t) INSTANTIABLE REF USING VARCHAR(13) FOR BIT DATA MODE DB2SQL; Za razliku od distinct tipova, tip atributa strukturnog tipa može biti i tip različit od
ugrađenih tipova. U ovom primeru, tip atributa Address je takođe strukturni tip, Address_t.
novembar 2009, Biljana Stojanović49
Čuvanje instanci strukturnog tipa Instanca strukturnog tipa može se sačuvati u bazi podataka na dva načina: Kao red tabele, u kome je svaka kolona tabele jedan atribut te instance. Da bi
se omogućilo čuvanje objekata kao redova tabele, tabela se definiše strukturnim tipom, pre nego specifikovanjem svake kolone:
CREATE TABLE Person OF Person_t ...
Svaka kolona tabele dobija ime i tip na osnovu imena i tipa odgovarajućeg atributa strukturnog tipa. Takve tabele poznate su pod nazivom tipizirane tabele.
Kao vrednost u koloni, pri čemu je tip kolone dati strukturni tip. Primer: kreira se tabela Properties koja sadrži kolonu Address strukturnog tipa
Address_t: CREATE TABLE Properties (ParcelNum INT, Photo BLOB(2K), Address Address_t) Strukturni tipovi mogu biti definisani kao INSTANTIABLE ili NOT INSTANTIABLE. Podrazumevano su instancni, što znači da se mogu kreirati instance tipova. Na
primer, ako se definiše Person_t kao NOT INSTANTIABLE, onda se ne mogu čuvati instance ovog tipa u bazi i ne mogu se kreirati tabele ili pogledi tog tipa.
novembar 2009, Biljana Stojanović50
Hijerarhija strukturnih tipova Strukturni tipovi omogućavaju dodatno
svojstvo – nasleđivanje. To znači da strukturni tip može imati podtip
koji sadrži sve atribute kao i dati strukturni tip, kao i dodatne atribute koji su za njega specifikovani. Originalni tip je u tom slučaju nadtip.
Na primer, strukturni tip Person_t može da ima atribute Name, Age i Adress. Podtip tipa Person_t može biti Employee_t koji sadrži atribute Name, Age i Adress i, dodatno, sadrži atribute SerialNum, Salary i Dept.
novembar 2009, Biljana Stojanović51
Hijerarhija strukturnih tipova (2) Skup podtipova koji se baziraju na istom nadtipu predstavlja
hijerarhiju tipova. Primer: Tip Manager_t nasleđuje atribute tipa Employee_t, ali sadrži
i dodatni atribut, kao što je specijalni bonus koji je jedino dostupan za menagere.
Tip Person_t je koreni tip hijerarhije. Person_t je nadtip tipova Employee_t i Student_t. Odnos između nadtipa i podtipa je tranzitivan, tj. Person_t je takođe nadtip i za Manager_t i Architect_t tipove.
Tip odseka, BusinessUnit_t nema podtipove, tako da je njegova hijerarhija trivijalna.
novembar 2009, Biljana Stojanović52
Kreiranje hijerarhije strukturnih tipovaCREATE TYPE BusinessUnit_t AS ( Name VARCHAR(20), Headcount INT) MODE DB2SQL; CREATE TYPE Person_t AS ( Name VARCHAR(20), Age INT, Address Address_t) REF USING VARCHAR(13) FOR BIT
DATA MODE DB2SQL; CREATE TYPE Employee_t UNDER
Person_t AS ( SerialNum INT, Salary DECIMAL(9,2), Dept REF(BusinessUnit_t))
MODE DB2SQL;
CREATE TYPE Student_t UNDER Person_t AS
( SerialNum CHAR(6), GPA DOUBLE) MODE DB2SQL; CREATE TYPE Manager_t UNDER
Employee_t AS ( Bonus DECIMAL(7,2)) MODE DB2SQL; CREATE TYPE Architect_t UNDER
Employee_t AS ( StockOption INTEGER) MODE DB2SQL;
novembar 2009, Biljana Stojanović53
Definisanje ponašanja strukturnih tipova Definisanje ponašanja strukturnih tipova vrši se upotrebom metoda. Ne mogu
se kreirati metodi za distinct tipove. Kreiranje metoda je slično kreiranju funkcija, osim što se metodi kreiraju
specijalno za dati tip, tako da su tip i opis njegovog ponašanja neraskidivo povezani.
Specifikacija metoda mora biti pridružena tipu pre izvršenja naredbe CREATE METHOD.
Sledeća naredba dodaje specifikaciju metoda calc_bonus za tip Employee_t:ALTER TYPE Employee_t
ADD METHOD calc_bonus (rate DOUBLE) RETURNS DECIMAL(7,2) LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC;
Jednom kada se pridruži specifikacija metoda odgovarajućem tipu, može se definisati ponašanje tipa kreiranjem metoda kao SQL metoda ili metoda definisanog na matičnom jeziku, prema zadatoj specifikaciji (komandnom CREATE METHOD).
novembar 2009, Biljana Stojanović54
Definisanje ponašanja strukturnih tipova (2) Na primer, sledeća naredba registruje SQL
metod calc_bonus koji se nalazi u istoj shemi kao i tip Employee_t:CREATE METHOD calc_bonus (rate DOUBLE) RETURNS DECIMAL(7,2) FOR Employee_t RETURN SELF..salary * rate;
Može se kreirati više metoda sa istim imenom, sve dok imaju različit broj ili različite tipove argumenata, ili su definisani za tipove u različitim hijerarhijama tipova.
novembar 2009, Biljana Stojanović55
Dinamičko izvršavanje metoda - polimorfizam Metodi definisani za neki strukturni tip mogu se pozivati samo nad
instancama tog tipa. Kada se definiše podtip, pored atributa koje nasleđuje, tu su i metodi definisani za nadtip. Međutim, metodi nadtipa se mogu pozivati i nad instancama podtipova.
Metod iz nadtipa se može predefinisati u podtipu, čime se omogućava polimorfizam. Polimorfizam omogućuje da se odluka koji će metod biti izvršen donosi na osnovu toga koji je tip instance strukturnog tipa nad kojim se metod primenjuje.
Da bi se metod predefinisao, koristi se naredba CREATE TYPE (ili ALTER TYPE), uz navođenje klauzule OVERRIDING pre klauzule METHOD. Ako se ne navede OVERRIDING, biće korišćen originalni metod (iz nadtipa). Da bi se definisao overriding metod, moraju da budu zadovoljeni sledeći uslovi:
Tip koji se kreira (ili menja) mora biti podtip strukturnog tipa čiji metod treba da se predefiniše
Potpis metoda (ime metoda i lista parametara) koji se deklariše mora biti identičan potpisu metoda u nadtipu
Overriding metod mora implicitno da predefiniše tačno jedan originalni metod
Rutina koja treba da se predefiniše je metod instance strukturnog tipa. Originalni metod nije deklarisan sa klauzulom PARAMETER STYLE JAVA.
novembar 2009, Biljana Stojanović56
Primer Tipovi podataka:CREATE TYPE a AS (z VARCHAR(20)) METHOD foo(i INTEGER) RETURNS VARCHAR(80) LANGUAGE SQL; CREATE TYPE b UNDER a AS (y VARCHAR(20)) OVERRIDING METHOD foo(i INTEGER) RETURNS
VARCHAR(80); CREATE TYPE c UNDER a AS (x VARCHAR(20)) OVERRIDING METHOD foo(i INTEGER) RETURNS
VARCHAR(80); CREATE TYPE d UNDER b AS (w VARCHAR(20)) OVERRIDING METHOD foo(i INTEGER) RETURNS
VARCHAR(80);
U ovoj situaciji, a je nadtip. Tipovi b i c su podtipovi tipa a. Konačno, d je podtip tipa b.
Metodi:CREATE METHOD foo(i INTEGER) FOR a RETURN "In method foo_a. Input: " | char(i) | self..z |
"."; CREATE METHOD foo(i INTEGER) FOR b RETURN "In method foo_b. Input: " | char(i) | self..z | " y = " | self..y | "."; CREATE METHOD foo(i INTEGER) FOR c RETURN "In method foo_c. Input: " | char(i) | self..z | " y = " | self..y | " x = " | self..x | "."; CREATE METHOD foo(i INTEGER) FOR d RETURN "In method foo_d. Input: " | char(i) | self..z | " y = " | self..y | " w = " | self..w | ".";
Originalni metod je fooA. fooB, fooC i fooD eksplicitno predefinišu metod fooA. fooD implicitno preklapa fooB i fooA. Slično, fooB implicitno preklapa fooA, dok fooC implicitno preklapa fooA. (Eksplicitno predefinisanje podrazumeva implicitno predefinisanje )
novembar 2009, Biljana Stojanović57
Poređenje strukturnih tipovaFunkcije kastovanja DB2 automatski kreira funkcije koje kastuju vrednosti referentnog tipa u
tip koji ga reprezentuje i obrnuto. CREATE TYPE naredba ima opcionu klauzu CAST WITH koja omogućava
izbor imena za ove dve funkcije. Podrazumevano, imena funkcija su ista kao i imena strukturnog tipa i reprezentacije referentnog tipa.
Na primer, CREATE TYPE Person_t naredba automatski generiše funkcije:
CREATE FUNCTION VARCHAR(REF(Person_t))
RETURNS VARCHAR i
CREATE FUNCTION Person_t(VARCHAR(13))
RETURNS REF(Person_t) Ove funkcije se koriste kad god je potrebno da se nova vrednost unese
u tipiziranu tabelu ili kada je potrebno porediti vrednost reference sa nekom drugom vrednošću.
DB2 takođe kreira funkcije koje omogućavaju poređenje referentnih tipova upotrebom operatora: =, <>, <, <=, > i >=.
novembar 2009, Biljana Stojanović58
Funkcija - konstruktor strukturnog tipa Kada se kreira strukturni tip, DB2 kreira funkciju istog
imena kao i tip koji se kreira. Ova funkcija nema parametre i vraća instancu strukturnog tipa sa svim atributima postavljenim na null vrednosti.
Za strukturni tip Person_t, na primer, kreira se funkcija:CREATE FUNCTION Person_t ( ) RETURNS Person_t
Za podtip Manager_t, konstruktor ima sledeći format: CREATE FUNCTION Manager_t ( ) RETURNS Manager_t
Za kreiranje instance tipa koja se unosi u kolonu tabele, koristiti konstruktor zajedno sa mutator-metodima.
Ako je tip sačuvan u tabeli, ne treba koristiti konstruktor sa mutator metodima za ubacivanje instance tipa.
novembar 2009, Biljana Stojanović59
Pristupni i mutator metodi strukturnih tipova Pristupni i mutator metodi postoje za svaki atribut instance strukturnog tipa. Instanca strukturnog tipa nad kojom se metod poziva zove se ciljna (subject)
instanca metoda. Mutator metodom se menja vrednost odgovarajućeg atributa instance i vraća se tako
promenjena instanca, dok se pristupnim metodom samo vraća tekuća vrednost odgovarajućeg atributa.
Za tip Persor_t, pristupni i mutator metod za atribut age, na primer, imaju sledeću formu:ALTER TYPE Person_t ADD METHOD AGE()
RETURNS INTEGER;
ALTER TYPE Person_t ADD METHOD AGE(int)
RETURNS Person_t; Za poziv metoda nad strukturnim tipom koristi se operator ‘..’ Primer upotrebe pristupnog metoda:
CREATE FUNCTION MailingAddress (p Person_t)
RETURNS VARCHAR(40)
RETURN p..name() || ' ' || p..address() U ovoj funkciji, vrednosti kolona name i address instance tipa Person_t se dobijaju
preko pristupnih metoda i nadovezuju se u jedan string – poštansku adresu.