Transakciona obrada - Ncd.matf.bg.ac.rs
Transakciona obrada - Ncd.matf.bg.ac.rs
Transakciona obrada - Ncd.matf.bg.ac.rs
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Transakciona</strong> <strong>obrada</strong><br />
vežbe, školska 2009/10<br />
Univerzitet u Beogradu, Matematički fakultet<br />
Biljana Stojanović
Korisnički definisane TABLE funkcije<br />
SQL korisnički definisane funkcije<br />
STORED procedure<br />
čas 07
Table funkcije<br />
Pod<strong>ac</strong>i kojima treba pristupiti nisu deo baze.<br />
I pored toga, pristup se može ostvariti pomoću SQL<br />
naredbi, upotrebom TABLE funkcija, tj. funkcija koje<br />
generišu tabele.<br />
Table fja vraća tabelu pozivajućoj SQL naredbi.<br />
Table fja može biti pozvana samo unutar FROM klauzule<br />
SELECT naredbe. Ona vraća tabelu pozivajućoj SELECT<br />
naredbi tako što vraća jedan red u datom trenutku.<br />
Table fja se definiše kao eksterna fja.<br />
3<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
SCRATCHPAD<br />
Java korisnički definisane funkcije mogu da koriste ili instancne<br />
promenljive ili opciju SCRATCHPAD da bi se postigao<br />
kontinuitet između poziva. Ako je ova opcija postavljena,<br />
kontinuitet se obezbeđuje, bez obzira koji od pomenuta dva<br />
načina će se koristiti.<br />
Ako su zadate opcije SCRATCHPAD i FINAL CALL onda se<br />
beležnica nikad ne modifikuje od strane sistema i bilo koji<br />
resu<strong>rs</strong>i referisani u beležnici moraju biti oslobođeni kada se<br />
izvrši konkretan FINAL CALL.<br />
Ako je zadato NO FINAL CALL onda eksterna table-fja mora<br />
da oslobodi takve resu<strong>rs</strong>e pri CLOSE završnom pozivu, a DB2<br />
će reinicijalizovati SCRATCHPAD za svaki OPEN poziv.<br />
Ova dva parametra su bitna pre svega ako se tabela koristi u<br />
podupitu ili za spajanje (više OPEN poziva se može javiti<br />
tokom izvršavanja naredbe).<br />
4<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
SCRATCHPAD se koristi da uspostavi kontinuitet između poziva.<br />
Tipovi poziva:<br />
<br />
<br />
<br />
<br />
<br />
FIRST - povezivanje sa Web serverom<br />
OPEN - inicijaliz<strong>ac</strong>ija, ne vraćaju se redovi<br />
FETCH - vraća se jedan red ili stanje "kraj tabele" ('02000' za<br />
SQLSTATE)<br />
CLOSE - nema prosleđenih argumenata<br />
- oslobađaju se resu<strong>rs</strong>i sistema<br />
- ne vraćaju se redovi<br />
FINAL - diskonekcija od servera<br />
<br />
Fajl za debagovanje treba da bude inicijalno otvoren u OPEN pozivu,<br />
potom dolazi FETCH za izdvajanje redova, pokazivač treba da bude<br />
alociran u SCRATCHPAD-u ili instancnoj promenljivoj.<br />
5<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
FINAL CALL, NO FINAL CALL<br />
Ove opcije kazuju da li da se izvrši završni poziv (i odvojeni<br />
prvi poziv fje). Takođe se kontroliše kada se vrši reinicijaliz<strong>ac</strong>ija<br />
beležnice.<br />
NO FINAL CALL – DB2 može da izvrši samo 3 vida poziva<br />
table fje - OPEN, FETCH, CLOSE.<br />
FINAL CALL – DB2 može da izvrši sve dostupne vidove<br />
poziva - FIRST, OPEN, FETCH, CLOSE, FINAL.<br />
Za eksterne table-fje argument koji određuje tip poziva je uvek<br />
prisutan, bez obzira koja je opcija postavljena.<br />
Ako se izvrši FINAL CALL zbor prekida ili kraja transakcije<br />
moguće je da fja neće izvršiti nijednu SQL naredbu. Posebna<br />
vrednost se prosleđuje fji u ovom slučaju preko argumenta<br />
(kojim se inače proseđuje tip poziva).<br />
6<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
CARDINALITY<br />
CARDINALITY integer – opciona klauzula<br />
Zadaje se očekivani broj redova koje će fja vratiti (bitno<br />
za optimiz<strong>ac</strong>iju).<br />
Ako se ne zada, DB2 će pretpostaviti neku konačnu<br />
vrednost kao DEFAULT.<br />
Ako fja ima beskonačnu kardinalnost (tj. vraća red svaki<br />
put kad se pozove i nikad ne vraća stanje “kraj tabele”,<br />
onda će upiti koji zahtevaju ovakvo stanje biti beskonačni i<br />
moraju biti prekinuti). Primeri ovakvih upita su oni koji<br />
sadrže GROUP BY ili ORDER BY klauzulu. Pisanje<br />
ovakvih fja nije preporučljivo.<br />
7<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Parametri za CREATE FUNCTION naredbu<br />
Neophodni parametri:<br />
RETURNS TABLE (column name data type, ...)<br />
EXTERNAL ...<br />
LANGUAGE ...<br />
PARAMETER STYLE ...<br />
[NOT] DETERMINISTIC<br />
NO SQL<br />
[NO] EXTERNAL ACTION<br />
DISALLOW PARALLEL<br />
Opcioni parametri:<br />
<br />
<br />
<br />
[NO] SCRATCHPAD<br />
[NO] FINAL CALL<br />
CARDINALITY n<br />
8<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
SQL korisnički definisane funkcije (skalarne<br />
i table funkcije)<br />
DB2 Development Center je grafički korisnički interfejs koji<br />
podržava razvoj korisnički definisanih funkcija.<br />
Trenutno podržava SQL skalarne i table funkcije.<br />
Nema podršku za debagovanje korisnički definisanih fja.<br />
Bitniji parametri pri definiciji fje:<br />
<br />
<br />
<br />
READS SQL DATA<br />
CONTAINS SQL (samo SQL naredbe koje ne čitaju niti modifikuju<br />
podatke mogu da se izvrše od strane funkcije)<br />
MODIFIES SQL DATA<br />
<br />
<br />
<br />
<br />
<br />
LANGUAGE SQL<br />
SPECIFIC<br />
DETERMINISTIC / NOT DETERMINISTIC<br />
EXTERNAL ACTION / NO EXTERNAL ACTION<br />
CALLED ON NULL INPUT<br />
9<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Ograničenja koja se odnose na pristup<br />
tabeli<br />
READS SQL DATA – nijedna naredba u fji ne može da<br />
pristupi tabeli koja se modifikuje od strane naredbe koja<br />
poziva fju.<br />
Primer: fja BONUS() je definisana sa parametrom READS<br />
SQL DATA.<br />
Ako se pozove UPDATE T1 SET KOL2 = KOL2 +<br />
BONUS(KOL1), nijedna SQL naredba u fji BONUS() NE<br />
SME da čita tabelu T1.<br />
Ovo ograničenje važi i za EKSTERNE funkcije.<br />
10<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Napomene<br />
Ako telo fje sadrži više referenci na TIME ili DATE<br />
specijalne registre, sve reference vraćaju istu vrednost.<br />
Ista vrednost će biti vraćena i ako se neki od registara<br />
referiše u SQL naredbi koja poziva fju.<br />
Telo SQL fje ne može da sadrži rekurzivni poziv same<br />
sebe ili neke druge fje koja je poziva.<br />
Ako je fja definisana sa MODIFIES SQL DATA i sadrži<br />
ugnježdene CALL naredbe, čitanje tabele koju fja<br />
modifikuje (ili svojom definicijom ili samom naredbom<br />
koja poziva fju) NIJE DOZVOLJENO.<br />
11<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Array tip podataka<br />
CREATE TYPE type-name AS data-type ARRAY [ integer<br />
constant | data-type2]<br />
type-name – ime tipa<br />
data-type – tip elemenata niza<br />
ARRAY[integer constant] – zadaje se maksimalan broj<br />
elemenata (ako se ne zada podrazumevano se koristi<br />
maksimalna dozvoljena vrednost za integer).<br />
Maksimalna kardinalnost niza je ograničena količinom<br />
raspoložive memorije za DB2 aplik<strong>ac</strong>iju.<br />
Stoga, iako je moguće kreirati nizove velike kardinalnosti,<br />
ne moraju svi elementi biti dostupni za upotrebu.<br />
12<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
data-type2 – specifikuje da je u pitanju asocijativni niz koji je<br />
indeksiran vrednostima tipa data-type2, koji može biti<br />
INTEGER ili VARCHAR.<br />
Vrednosti koje se zadaju za indekse prilikom dodele vrednosti<br />
elementima niza moraju biti validne vrednosti tipa data-type2.<br />
Broj elemenata niza jednak je broju jedinstvenih vrednosti<br />
indeksa.<br />
Upotreba ARRAY tipa:<br />
<br />
<br />
<br />
<br />
<br />
Lokalna promenljiva u složenoj (compound) SQL naredbi<br />
Parametar SQL rutine<br />
Parametar Java procedure (samo uređeni nizovi)<br />
Povratni tip SQL fje<br />
Globalna promenljiva<br />
13<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Primeri<br />
<br />
CREATE TYPE PHONENUMBERS AS DECIMAL(10,0) ARRAY[50]<br />
<br />
<br />
-- Kreira se nizovski tip NUMBERS sa default brojem elemenata u shemi GENERIC<br />
CREATE TYPE GENERIC.NUMBERS AS DECFLOAT(34) ARRAY[]<br />
<br />
<br />
<br />
-- Kreira se asocijativni niz elemenata tipa decimal(16,0) koji se indeksira<br />
-- stringovima kao sto su 'Home', 'Work', 'Mom'...<br />
CREATE TYPE PERSONALPHONENUMBERS AS DECIMAL(16, 0) ARRAY[VARCHAR(8)]<br />
<br />
<br />
<br />
-- Kreira se niz čiji su elementi nazivi glavnih gradova.<br />
-- Niz je asocijativni, indeksi su imena pokrajina, teritorija ili država<br />
CREATE TYPE CAPITALSARRAY AS VARCHAR(30) ARRAY[VARCHAR(20)]<br />
<br />
<br />
<br />
-- Kreira se asocijativni niz opisa proizvoda ne dužih od 40 karaktera, pri čemu<br />
-- su indeksi brojevi proizvoda (brojevi nisu duži od 12 karaktera).<br />
CREATE TYPE PRODUCTS AS VARCHAR(40) ARRAY[VARCHAR(12)]<br />
14<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Stored procedure<br />
Pored funkcija (UDF), postoje još dva tipa korisničkih<br />
rutina koje se koriste u sistemu DB2 – stored procedure i<br />
metodi.<br />
Kao i fje i stored procedure mogu biti sistemske i<br />
korisnički definisane.<br />
Stored procedure služe kao proširenje klijentskih<br />
aplik<strong>ac</strong>ija, rutina, trigera i slično.<br />
Pozivaju se izvršavanjem CALL naredbe za kojom sledi<br />
ime procedure.<br />
Procedure mogu imati ulazne, izlazne, kao i ulazno-izlazne<br />
parametre, mogu da izvršavaju široki spektar SQL naredbi<br />
i da vraćaju više rezultujućih skupova pozivaocu.<br />
15<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Stored procedura je program koji se čuva u DB2 bazi i<br />
pokreće na DB2 serveru.<br />
Aplik<strong>ac</strong>ija može da pozove stored proceduru po imenu i<br />
pokrene SQL naredbe koji su deo procedure. Storedprocedure<br />
i user-defined funkcije (UDF) se često<br />
označavaju terminom rutine.<br />
Naredbom CREATE PROCEDURE definiše se stored<br />
procedura na serveru. Sve procedure kreirane na ovaj način<br />
registrovane su u katalogu SYSCAT.ROUTINES.<br />
Korisnički definisana procedura poziva se SQL naredbom<br />
CALL.<br />
16<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Tipovi procedura<br />
Mogu se kreirati tri tipa procedura:<br />
Sopljašnje (external). Telo procedure je napisano u nekom<br />
programskom jeziku.<br />
Sourced. Definiše se procedura koja se bazira na drugoj<br />
proceduri.<br />
SQL. Telo procedure je napisano na SQL-u.<br />
Procedura se definiše svojim imenom za kojim može da<br />
sledi lista argumenata između zagrada.<br />
Argumenti procedure su skalarne vrednosti, koje mogu<br />
biti različitih tipova. Argumenti mogu da služe za prenos<br />
vrednosti proceduri, prihvatanje povratne vrednosti<br />
procedure ili u druge svrhe.<br />
17<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
CREATE PROCEDURE (external)<br />
Definiše eksternu proceduru na tekućem serveru.<br />
Nivo autoriz<strong>ac</strong>ije za naredbu CREATE PROCEDURE mora da uključi<br />
bar:<br />
CREATE_EXTERNAL_ROUTINE autoriz<strong>ac</strong>ija za bazu i bar :<br />
<br />
<br />
<br />
<br />
<br />
IMPLICIT_SHEMA autoriz<strong>ac</strong>iju nad bazom, ako ime sheme procedure ne<br />
referiše na postojeću shemu<br />
CREATEIN pravo nad shemom, ako ime sheme procedure referiše na<br />
postojeću shemu<br />
DBADM nivo autoriz<strong>ac</strong>ije<br />
Za kreiranje NOT FENCED procedura prava moraju da uključe i<br />
bar:<br />
<br />
<br />
CREATE_NOT_FENCED_ROUTINE autoriz<strong>ac</strong>iju za bazu<br />
DBADM autoriz<strong>ac</strong>iju<br />
Za kreiranje FENCED procedura ne zahtevaju se nikakva dodatna<br />
prava ili autoriz<strong>ac</strong>ije.<br />
18<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Sintaksa naredbe CREATE PROCEDURE<br />
CREATE [OR REPLACE] PROCEDURE ime_procedure (<br />
lista_parametara ) lista_opcija<br />
OR REPLACE<br />
Zamena definicije procedure, ako procedura sa istim<br />
imenom postoji na serveru. Postojeća definicija se uklanja,<br />
pre nego što se nova doda u katalog.<br />
ime_procedure – može biti kvalifikovano (imenom<br />
sheme) ili nekvalifikovano. Unutar sheme ne smeju da<br />
postoje dve procedure sa istim imenom i istim brojem<br />
parametara, čak i kada su različiti njihovi tipovi.<br />
19<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Deklar<strong>ac</strong>ija parametara<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Deklar<strong>ac</strong>ija parametra je oblika:<br />
IN | OUT | INOUT ime_parametra tip_parametra [DEFAULT<br />
vrednost]<br />
IN – Identifikuje parametar kao ulazni parametar procedure. Bilo<br />
koje promene ulaznog parametra unutar procedure nisu dostupne<br />
pozivajućoj aplik<strong>ac</strong>iji nakon završetka procedure. IN je<br />
podrazumevani mod parametra procedure.<br />
OUT – Identifikuje parametar kao izlazni parametar procedure<br />
INOUT – Identifikuje parametar kao ulazno/izlazni<br />
Ako procedura vrati grešku, OUT parametri ostaju nedefinisani, a<br />
INOUT ostaju nepromenjeni.<br />
ime_paramtera se zadaje opciono i mora biti jedinstveno za<br />
proceduru<br />
tip_parametra – može biti ugrađeni tip ili nizovski tip. Ne smeju se<br />
koristiti strukturni tipovi.<br />
20<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
DEFAULT – parametri sa DEFAULT vrednostima su<br />
poslednji u listi, tj. nakon DEFAULT parametara ne može<br />
da se navede parametar koji nema DEFAULT vrednost.<br />
DEFAULT ne sme da se koristi za INOUT ili OUT<br />
parametre, kao ni za parametre tipa ARRAY, ROW ili<br />
CURSOR.<br />
Za podrazumevane vrednosti se najčešće koriste null<br />
konstante, globale promenljive ili izrazi (unutar malih zagrada).<br />
Ako se koristi izraz, mora da odgovara tipu parametra i ne<br />
sme da modifikuje SQL podatke i vrši spoljašnje akcije.<br />
21<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Parametri (opcije)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
LANGUAGE – obavezna klauzula kojom se specifikuje programski jezik (C, Java,<br />
Cobol, CLR, OLE). Za programski jezik Java, sistem za upravljanje bazom podataka<br />
poziva proceduru kao metod u Java klasi.<br />
SPECIFIC specific_name – obezbeđuje jedinstveno ime za instancu procedure koja<br />
se definiše. Ovo ime može se koristiti prilikom uklanjanja procedure (drop). Ne sme<br />
se koristiti za pozivanje procedure. Ime može biti jednako nekom postojećem imenu<br />
procedure.<br />
Ako se ne zada specfic_name, generiše se automatski u obliku:<br />
„SQLyymmddhhmmssxxx‟.<br />
DYNAMIC RESULT SETS integer – označava očekivanu gornju granicu za broj<br />
rezultujućih skupova procedure<br />
NO SQL – procedura ne može da izvrši ni jednu SQL naredbu<br />
CONTAINS SQL – mogu da se izvrvšavaju samo SQL naredbe koje ne čitaju niti<br />
modifikuju podatke<br />
READS SQL DATA – mogu se uključiti neke SQL naredbe koje ne menjaju podatke<br />
MODIFIES SQL DATA – mogu da se izvršavaju sve SQL naredbe, osim onih koje<br />
nisu podržane za datu proceduru<br />
22<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
DETERMINISTIC – za uspešne pozive procedura uvek vraća isti rezultat sa istim ulaznim parametrima<br />
NOT DETERMINISTIC – rezultat procedure može da zavisi od nekih spoljašnjih uticaja<br />
Klauzule ne utiču na izvršavanje procedure.<br />
CALLED ON NULL INPUT – uvek se primenjuje na procedure. Klauzula označava da će procedura biti<br />
pozvana bez obzira da li je neki od parametara NULL.<br />
EXTERNAL NAME „string‟ – identifikuje se ime fajla sa implement<strong>ac</strong>ijom procedure.<br />
Format string-konstante zavisi od programskog jezika.<br />
U Javi, format string-konstante je:<br />
jar_id: class_id . method_id<br />
Obuhvata opciono ime jar fajla, ime klase i ime metoda koji se poziva da bi se procedura izvršila.<br />
Ime klase i ime metoda ne moraju da postoje u trenutku izvršavanja CREATE PROCEDURE komande, ali<br />
zato, ako je navedeno ime jar fajla, on mora da postoji. Sa druge strane, kada se procedura poziva, klasa i<br />
metod moraju da postoje i da su dostupni serveru, inače se javlja greška.<br />
Ceo string mora da se navede između jednostrukih navodnika i ne sme biti dodatnih blanko karaktera.<br />
jar_id – jar identifikator koji je dodeljen jar-kolekciji kada je instalirana u bazu. Može biti kvalifikovani ili<br />
nekvalifikovani identifikator (npr. „myJar‟ ili „mySchema.myJar‟).<br />
class_id – identifikator klase Java objekta. Ako klasa pripada paketu, potrebno je kvalifikovati ime klase<br />
imenom paketa.<br />
23<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
EXTERNAL identifier – SQL identifikator (samo u C-u)<br />
FENCED ili NOT FENCED – specifikuje se da li se procedura<br />
smatra „sigurnom‟ za pokretanje (NOT FENCED) ili ne (FENCED).<br />
Ako stoji FENCED, sistem za upravljanje bazom štiti svoje unutrašnje<br />
resu<strong>rs</strong>e (npr. bafere podataka) od pristupa od strane procedure.<br />
Sve procedure moraju imati neku od ovih opcija. Ista procedura<br />
neće se isto izvršavati sa jednom ili drugom opcijom.<br />
Napomena! Ako se koristi NOT FENCED sa procedurama koje<br />
nisu adekvatno proverene, integritet baze može biti narušen.<br />
SYSADM, DBADM ili specijalni nivo autoriz<strong>ac</strong>ije<br />
CREATE_NOT_FENCED su potrebni da bi se registrovala<br />
procedura kao NOT FENCED.<br />
24<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
THREADSAFE ili NOT THREADSAFE – specifikuje se da li se procedura smatra<br />
„sigurnom‟ za pokretanje u istom procesu kao i druge rutine (THREADSAFE) ili ne<br />
(NOT THREADSAFE).<br />
Generalno, da bi procedura bila THREADSAFE, ne bi trebala da koristi globalne ili<br />
statičke prostore podataka.<br />
Ako je navedeno THREADSAFE, sistem za upravljanje bazom može da pozove<br />
proceduru u istom procesu u kojem je i neka druga procedura pozvana.<br />
Ako je navedeno NOT THREADSAFE, sistem za upravljanje bazom nikada neće<br />
pozvati proceduru u istom procesu u kojem je i neka druga procedura pozvana.<br />
Za FENCED procedure, THREADSAFE je podrazumevani mod za Javu.<br />
Za NOT FENCED procedure, THREADSAFE je podrazumevani mod u svim<br />
programskim jezicima. NOT THREADSAFE ne može da se zada.<br />
COMMIT ON RETURN – specifikuje da li se izvršava naredba COMMIT kada<br />
procedura vraća vrednost.<br />
NO – podrazumevano, ne vrši se commit<br />
YES – commit se izvršava kada procedura vraća vrednost, ako CALL naredba vraća<br />
pozitivan SQLCODE. Ako procedura vraća rezultujuće skupove, ku<strong>rs</strong>ori koji su im<br />
pridruženi moraju se definisati sa opcijom WITH HOLD kako bi mogli da se koriste<br />
nakon commit.<br />
25<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
AUTONOMOUS – procedura se izvršava u svom autonomnom transakcionom<br />
opsegu<br />
Restrikcije koje se odnose na autonomne rutine:<br />
Ne mogu da vrate rezultujući skup<br />
Ne podržavaju sledeće tipove podataka: ku<strong>rs</strong>ore, strukturne tipove i XML<br />
EXTERNAL ACTION ili NO EXTERNAL ACTION – specifikuje da li procedura<br />
preduzima neke akcije koje menjaju stanje objekta kojim ne upravlja menadžer baze<br />
(EXTERNAL ACTION) ili ne (NO EXTERNAL ACTION).<br />
EXTERNAL ACTION je podrazumevani mod.<br />
PARAMETER STYLE – određuje konvenciju kojom se definiše način prenosa<br />
(prosleđivanja) parametara proceduri i iz procedure.<br />
DB2 SQL, SQL, GENERAL, GENERAL WITH NULLS – nisu podržani u Javi<br />
DB2GENERAL – način prenosa parametara koji je definisan za Java metode. Može<br />
samo da se koristi za Javu.<br />
JAVA – način prenosa parametara koji odgovara Java jeziku i SQL rutinama.<br />
IN/OUT i OUT parametri prosleđuju se kao nizovi od jednog elementa.<br />
Ovaj stil parametara ne podržava DBINFO ili PROGRAM TYPE klauzulu.<br />
26<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
PARAMETER CCSID – ova klauzula nije podržana u Javi. Specifikuje<br />
kodnu stranu (shemu) koja se koristi za sve stringove u proceduri.<br />
Podrazumevana vrednost je PARAMETER CCSID UNICODE za<br />
Unicode baze, tj. ASCII za ostale baze.<br />
PROGRAM TYPE<br />
<br />
<br />
SUB – procedura očekuje da se parametri proslede kao odvojeni<br />
argumenti. Podrazumevani mod.<br />
MAIN – procedura očekuje da se parametri proslede u formi (argc, argv),<br />
gde je argv vektor argumenata, a argc brojač argumenata. Ime procedure koja<br />
se poziva mora biti main. Ovaj mod nije podržan u Javi.<br />
DBINFO ili NO DBINFO – specifikuje da li se posebne inform<strong>ac</strong>ije<br />
od strane DB2 sistema prosleđuju proceduri prilikom njenog poziva<br />
kao dodatni argument (DBINFO) ili ne (NO DBINFO). DBINFO<br />
nije podržan za PARAMETER STYLE JAVA ili DB2GENERAL.<br />
NO DBINFO je podrazumevani mod.<br />
27<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Poziv stored procedure u SQLJ aplik<strong>ac</strong>ijama<br />
Osnovni kor<strong>ac</strong>i za poziv stored procedure:<br />
Dodeljivanje vrednosti ulaznim parametrima (IN ili INOUT)<br />
Proziv procedure – naredba CALL<br />
Generisanje izlaznih parametara (OUT ili INOUT)<br />
Obrada rezultata procedure<br />
28<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Upotreba imenovanih parametara u CALL<br />
naredbama<br />
<br />
<br />
<br />
<br />
<br />
Mogu se koristiti imenovani parametri za mapiranje hostpromenljivih<br />
(matičnih promenljivih) u CALL naredbi imenima<br />
parametara iz definicije procedure.<br />
Dakle, imenovani parametri referišu na matične promenljive.<br />
Parametri u CALL naredbi ne moraju se navesti u istom redosledu<br />
kao i parametri u definiciji procedure i ne moraju se navesti svi<br />
parametri. Oni parametri koji nisu navedeni dobijaju podrazumevane<br />
vrednosti koje su navedene u definiciji procedure. Pri tom, mogu se<br />
izostaviti samo oni parametri u CALL naredbi za koje su navedene<br />
DEFAULT vrednosti u CREATE PROCEDURE naredbi.<br />
Može se eksplicitno dodeliti podrazumevana vrednost ili null vrednost<br />
imenovanom parametru navođenjem DEFAULT ili NULL ključne reči.<br />
U istoj CALL naredbi ne mogu se mešati imenovani i neimenovani<br />
parametri.<br />
29<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Primer<br />
CREATE PROCEDURE IN_PARAMS (<br />
IN lowkred SMALLINT,<br />
IN medkred SMALLINT,<br />
IN highkred SMALLINT)<br />
SPECIFIC SQLJ_IN_PARAMS<br />
DYNAMIC RESULT SETS 0<br />
DETERMINISTIC<br />
LANGUAGE JAVA<br />
PARAMETER STYLE JAVA<br />
NO DBINFO<br />
FENCED<br />
THREADSAFE<br />
MODIFIES SQL DATA<br />
PROGRAM TYPE SUB<br />
EXTERNAL NAME 'SpServer.inParams'@<br />
30<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Primer (nastavak)<br />
Ulazni parametri CALL naredbe su predstavljeni<br />
imenovanim parametrima.<br />
short lowKredIn = 5;<br />
short medKredIn = 15;<br />
short highKredIn = 30; // host promenljive za ulazne<br />
parametre<br />
...<br />
#sql {CALL IN_PARAMS (lowkred => :IN lowKredIn,<br />
medkred => :IN medKredIn,<br />
highkred => :IN highKredIn) };<br />
...<br />
31<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Vraćanje više od jednog rezultujućeg skupa<br />
iz procedure<br />
<br />
<br />
<br />
Procedura može da vraća nula, jedan ili više rezultujućih skupova<br />
pozivajućem programu tako što se pri definiciji uključi klauzula<br />
DYNAMIC RESULT SETS n , (n >= 0).<br />
Pozivajući program treba da izdvoji sadržaj rezultujućih skupova, što<br />
podrazumeva:<br />
<br />
<br />
Dobijanje izvršnog konteksta za izdvajanje rezultujućeg skupa iz stored<br />
procedure.<br />
Dodeljivanje izvršnog kontekstva CALL naredbi za stored proceduru.<br />
Napomena! Ne koristiti ovaj izvršni kontekst u bilo koje druge svrhe<br />
dok se ne izdvoji i poslednji rezultujući skup.<br />
Za svaki rezultujući skup:<br />
<br />
<br />
<br />
Iskoristiti ExecutionContext metod getNextResultSet za izdvajanje<br />
rezultujućeg skupa<br />
Ako nije poznat sadržaj rezultujućeg skupa, koristiti ResultSetMetaData<br />
metode za izdvajanje ove inform<strong>ac</strong>ije<br />
Koristiti SQLJ iterator ili JDBC ResultSet da se izdvoje redovi rezultujćeg<br />
skupa<br />
32<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Rezultujući skupovi se vraćaju pozivajućem programu u istom<br />
redosledu u kojem su njihovi ku<strong>rs</strong>ori otvoreni u proceduri.<br />
Kada nema više rezultujućih skupova, metod getNextResultSet vraća<br />
null.<br />
Metod ima dve forme:<br />
<br />
<br />
getNextResultSet() – zatvara se trenutno otvoreni rezultujući skup i napreduje<br />
se na naredni<br />
getNextResultSet(int current) – vrednost current ukazuje šta se radi sa<br />
trenutno otvorenim rezultujućim skupom pre nego što se pređe na naredni.<br />
Postoje sledeće opcije:<br />
<br />
<br />
<br />
java.sql.Statement.CLOSE_CURRENT_RESULT – zatvara se<br />
java.sql.Statement.KEEP_CURRENT_RESULT – tekući skup ostaje otvoren kada se<br />
vraća naredni<br />
java.sql.Statement.CLOSE_ALL_RESULTS – svi otvoreni ResultSet objekti se<br />
zatvaraju kada se vraća naredni.<br />
Primeri: SpServer.resultSetToClient i SpServer.threeResultSets<br />
33<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Paralela između funkcija i procedura<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Funkcija predstavlja rel<strong>ac</strong>iju između ulaznih i izlaznih podataka.<br />
Funkcija je oper<strong>ac</strong>ija koja se pokreće navođenjem imena fje i liste<br />
argumenata.<br />
Razlikujemo sistemske ugrađene fje i korisnički definisane fje.<br />
Ugrađene fje vraćaju skalarnu vrednost kao rezultat i deo su SYSIBM<br />
sheme. Obuhvataju: agregatne fje, fje operatore, fje kastovanja i<br />
druge.<br />
Korisnički definisane fje registruju se u SYSCAT.ROUTINES nakon<br />
kreiranja. Nisu deo SYSIBM sheme.<br />
Postoje i određene pre-instalirane korisnički definisane fje koje<br />
obezbeđuje sam sistem (nisu ugrađene fje). Nalaze se u shemama<br />
SYSFUN i SYSPROC.<br />
Funkcije se mogu klasifikovati kao: agregatne, skalarne, row fje i table<br />
fje.<br />
Potpis fje čine ime sheme, ime fje i lista argumenata.<br />
34<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Procedura je aplikativni program koji može da se pokrene sql<br />
naredbom CALL.<br />
Specifikuje se svojim imenom za kojim može doći lista<br />
argumenata.<br />
Mogu da se pozovu iz klijentske aplik<strong>ac</strong>ije, neke druge rutine,<br />
trigera i dinamičkih složenih naredbi – svuda gde je dozvoljeno<br />
izvršiti CALL naredbu.<br />
Mogu da pozivaju druge procedure ili fje.<br />
Podržani su rekurzivni pozivi.<br />
Savepoint-i i kontrola transakcija su podržani unutar<br />
procedura.<br />
Stored procedure ne mogu da čuvaju stanje između poziva<br />
(kao što je to slučaj sa funkcijama).<br />
35<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010
Najčešće upotrebe stored procedura<br />
<br />
<br />
<br />
Standardiz<strong>ac</strong>ija logike u aplik<strong>ac</strong>ijama<br />
<br />
Ukoliko više aplik<strong>ac</strong>ija treba na sličan način da pristupi ili modifikuje podatke u bazi,<br />
procedura može da obezbedi zajednički interfejs. Time procedura može da se više<br />
puta koristi. Ako je potrebno promeniti interfejs, menja se samo procedura.<br />
Razdvajanje oper<strong>ac</strong>ija nad bazom od ostalih oper<strong>ac</strong>ija unutar aplik<strong>ac</strong>ije<br />
<br />
Pristup bazi iz određenih razloga koji se može više puta primenjivati može biti deo<br />
procedure. Na primer, mogu se enkapsulirati oper<strong>ac</strong>ije nad bazom specifične za upis<br />
studenata ili zapošljavanje radnika. Ovakva procedura može da unosi podatke o<br />
studentima ili radnicima u više tabela, da računa prosek studenata ili prosečnu platu<br />
radnika (nedeljnu, mesečnu) na osnovu ulaznog parametra i da vrati dobijeni<br />
rezultat kao izlazni parametar. Neka druga procedura može da radi statističke<br />
analize podataka u tabeli i da vrati rezultujuće skupove sa prikupljenim<br />
inform<strong>ac</strong>ijama.<br />
Pojednostavljivanje upravljanja pravima za grupu SQL naredbi<br />
<br />
Grupa SQL naredbi se obuhvata jednom procedurom, tako da se omogućuje da se<br />
umesto davanja (grant) privilegija neophodnih za izvršavanje pojedinačnih SQL<br />
naredbi, daje neophodno pravo da se pozove procedura.<br />
36<br />
<strong>Transakciona</strong> <strong>obrada</strong>, mart 2010