590 likes | 715 Views
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.
E N D
Distribuirane i objektne baze podatakavežbe, školska 2009/10 Univerzitet u Beogradu, Matematički fakultet Biljana Stojanović novembar 2009, Biljana Stojanović
Objektno-relacionimodel u sistemu DB2Korisnički tipovi podataka (UDT) čas 07 novembar 2009, Biljana Stojanović
DB2 objektno-relaciona podrška • 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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
Tabela funkcija konverzije novembar 2009, Biljana Stojanović
Tabela funkcija konverzije (2) novembar 2009, Biljana Stojanović
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ć
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ć
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ć
Primer 2 CREATE DISTINCT TYPE US_DOLLAR AS DECIMAL (9,3) WITH COMPARISONS CREATE DISTINCT TYPE CANADIAN_DOLLAR AS DECIMAL (9,3) WITH COMPARISONS CREATE 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ć
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ć
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ć
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ć
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ć
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ć
Dodele vrednosti upotrebom distinct tipova u ugrađenom SQL-u EXEC 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ć
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ć
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ć
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ć
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ć
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ć
Kreiranje strukturnih tipova novembar 2009, Biljana Stojanović
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ć
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ć
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ć
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ć
Kreiranje strukturnih tipova (2) novembar 2009, Biljana Stojanović
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ć
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ć
Kreiranje strukturnih tipova (3) novembar 2009, Biljana Stojanović
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ć
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ć
Dakle, ako je metod X definisan sa ovom opcijom, generisaće se tri scratchpad-a nakon select naredbe: SELECT A, X..(A) FROM TABLEB WHERE 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ć
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ć
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ć
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ć
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ć
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ć
Č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ć
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ć