09.04.2014 Views

Transakciona obrada - Ncd.matf.bg.ac.rs

Transakciona obrada - Ncd.matf.bg.ac.rs

Transakciona obrada - Ncd.matf.bg.ac.rs

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!