Professional Documents
Culture Documents
Informix SPL Kratke Upute
Informix SPL Kratke Upute
kratko uputstvo
(Interni dopunski prirunik za LV iz Baza podataka na FE Tuzla)
SADRAJ
1 2 3 Uvod ............................................................................................................................................. 3 Uvod u SPL Rutine ...................................................................................................................... 3 Pisanje SPL rutina ........................................................................................................................ 3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 4 4.1 4.2 4.3 4.3.1 4.3.2 5 6 Poetak i kraj rutine ............................................................................................................. 3 Ime SPL rutine ..................................................................................................................... 4 Parametri rutine .................................................................................................................... 4 Return klauzula .................................................................................................................... 5 Definisanje tipa SPL funkcije .............................................................................................. 5 Modifikatori ......................................................................................................................... 5 Klauzule DOCUMENT i WITH LISTING IN ................................................................... 6 Komentari............................................................................................................................. 6 Primjer kompletne rutine ..................................................................................................... 6 Kreiranje SPL rutine iz tekstualnog fajla ............................................................................. 6 Brisanje SPL rutine .............................................................................................................. 7 Lokalne varijable.................................................................................................................. 7 Deklarisanje globalnih varijabli ......................................................................................... 11 Dodjeljivanje vrijednosti varijablama ................................................................................ 12 Naredba LET .............................................................................................................. 12 Ostali naini dodjele vrijednosti varijablama............................................................. 13
Izrazi u SPL rutinama ................................................................................................................ 13 Pisanje bloka naredbi ................................................................................................................. 13 6.1 6.2 6.3 6.4 6.5 6.6 Implicitni i eksplicitni blok naredbi ................................................................................... 13 Upotreba kursora ................................................................................................................ 14 Upotreba FOREACH petlje za definisanje kursora ........................................................... 14 Upotreba IF - ELIF - ELSE strukture ................................................................................ 15 WHILE i FOR petlje .......................................................................................................... 16 Izlazak iz petlje .................................................................................................................. 17
7 8
Vraanje vrijednosti iz SPL funkcije ......................................................................................... 17 Rukovanje podacima Row tipa .................................................................................................. 19 8.1 8.2 Prioritet Dot notacije .......................................................................................................... 19 Auriranje izraza Row tipa ................................................................................................ 20 Obrada greaka u pohranjenim procedurama......................................................................... 21
9 10
1 Uvod
Literatura: http://www.zpm.fer.hr/courses/idb/aud/indexAud.html
IBM Informix Guide to SQL, Reference, ver. 11.30 IBM Informix Guide to SQL, Syntax, ver. 11.30 IBM Informix Guide to SQL, Tutorial, ver. 11.30
SPL rutina je korisniki definisana rutina napisana u Informix-ovom jeziku za pohranjene procedure (Stored Procedure Language - SPL). Informix SPL je proirenje SQL-a koje obezbjeuje kontrole toka, kao to su petlje i grananja. Svaki korisnik koji ima Resource dozvolu na nekoj bazi podataka moe kreirati SPL rutine. Rutine napisane u SQL-u se ralanjuju, optimiziraju i u izvrnom formatu pohranjuju u sistemske tabele. SPL rutina moe biti dobar izbor za SQL-intenzivne zadatke. SPL rutina moe izvriti rutine napisane u C-u ili Javi, a eksterne r. mogu izvriti SPL r.
Svaku rutinu jednoznano identifikuje njena oznaka (signature) koju ine: tip (procedura ili funkcija) i ime rutine, te broj, tip i redoslijed parametara). Rutina se moe jednoznano identifikovati i pomou dodatnog specifinog imena koje se definie u CREATE PROCEDURE ili CREATE FUNCTION naredbi pomou kljune rijei SPECIFIC, npr.:
CREATE FUNCTION calculate(a INT, b INT, c INT) RETURNING INT SPECIFIC calc1; END FUNCTION;
Ako je ovu rutinu kreirao korisnik basim, ona se moe pozvati kao basim.calculate ili calc1 . Specifina imena rutina moraju biti jedinstvena unutar jedne baze. Moe biti dugo do 18 karaktera.
Pri pozivu SPL rutine, argumentu se moe dati NULL vrijednost. SPL rutine podrazumijevano obrauju NULL vrijednosti. NULL vrijednost se ne moe dati argumentu koji je element kolekcije. Iako se ne moe definisati parametar tipa TEXT ili BYTE, moe se upotrijebiti kljuna rije REFERENCES za definisanje parametra koji prihvata pokaziva na takav tip, na primjer:
CREATE PROCEDURE proc1(lo_text REFERENCES TEXT) CREATE FUNCTION proc2(lo_byte REFERENCES BYTE DEFAULT NULL)
Ako se u pozivu rutine neki argument ne dostavi a odgovarajui parametar nema podrazumijevanu vrijednost, tom argumentu, koji se unutar rutine koristi kao varijabla, se dodjeljuje status nedefinisan (undefined). Takva SPL rutina se izvrava bez greke, sve dok se u tijelu rutine ne pokua upotrijebiti varijabla koja ima nedefinisan status. Status nedefinisan nije isto to i NULL vrijednost. 4
Nakon return klauzule, u tijelu rutine se mora navesti i RETURN naredba koja eksplicitno vraa vrijednosti pozivnoj rutini. Za specificiranje vraanja podatka tipa TEXT ili BYTE, mora se upotrijebiti klauzula REFERENCES, zato to SPL rutina vraa samo pokaziva na dati objekt, a ne sam objekt. (npr: RETURNING REFERENCES BYTE).
3.6 Modifikatori
Pomou WITH klauzule se u SPL funkcije mogu unijeti razliiti modifikatori. Najee se koriste modifikatori COMMUTATOR i NEGATOR (ostali se koriste za eksterne rutine). Dvije funkcije su meusobno komutator funkcije ako prihvataju iste argumente, ali u obrnutom redoslijedu, i vraaju isti rezultat. Modifikator COMMUTATOR specificira komutator funkciju za funkciju u kojoj je naveden. SQL optimizator moe koristiti komutator funkciju umjesto date, ako mu je ekonominija. Na primjer, funkcije lessthan(a,b), koja vraa TRUE ako je a manje od b, i greaterthan(b,a), koja vraa TRUE ako je b vee ili jednako a, su komutator funkcije.
CREATE FUNCTION lessthan( a dtype1, b dtype2 ) RETURNING BOOLEAN WITH ( COMMUTATOR = greaterthan ); END FUNCTION;
Da bi specificirao komutator funkciju u funkciji koju kreira korisnik mora biti vlasnik te komutator funkcije. Korisniku kome se dodjeljuje dozvola za izvravanje date funkcije mora se dati i dozvola za izvravanje njene komutator funkcije. Modifikator NEGATOR se koristi za Boolean funkcije. Dvije Boolean funkcije su meusobno negator funkcije ako prihvataju iste argumente, u istom redoslijedu, i vraaju komplementarne Boolean vrijednosti. Na primjer, funkcije equal(a,b), koja vraa TRUE ako je a jednako b, i notequal(a,b), koja vraa FALSE ako je a jednako b, su negator funkcije. Optimizatior moe izabrati da umjesto zadate funkcije izvri njenu negator funkciju.
Tekst komentara uz DOCUMENT klauzulu se zatvara jednostrukim ili dvostrukim navodnicima. Ako se komentar protee na vie linija onda treba svaku liniju zatvoriti navodnicima. Klauzula WITH LISTING IN definie naziv fajla u koji e biti pohranjena sva eventualna upozorenja kompajlera. Na primjer: WITH LISTING IN 'C:\tmp\listfile'. Ime fajla, sa putem, se mora zatvariti navodnicima.
3.8 Komentari
Komentari se mogu unijeti u bilo koju liiju SPL rutine, pa i u praznu liniju. Komentar se oznaava dvostrukom crticom (--) ispred komentara (komentar je sve do kraja linije), ili zatvara u par vitiastih zagrada { }. (Moe preko vie linija).
Ako u bazi postoji vie rutina sa istim imenom (preoptereene rutine), za brisanje neke od njih treba specificirati ili oznaku rutine ili njeno specifino ime, na primjer:
DROP FUNCTION calculate( a INT, b INT, c INT); -- ovo je oznaka DROP SPECIFIC FUNCTION calc1; -- ovo je specifino ime
Ako se ne zna tip rutine (funkcija ili procedura), za brisanje se moe koristiti naredba DROP RUTINA, na primjer:
DROP RUTINA calculate; DROP SPECIFIC RUTINA calc1;
SPL rutina na udaljenom serveru baze podataka se moe brisati pomou punog imena rutine u obliku bazapodataka@imedbservera:vlasnik.imerutine ako je samo ime rutine, bez argumenta, dovoljno za njenu identifikaciju.
Jedna SPL varijabla ima ime i tip podatka. Za ime varijable vrijede pravila za Informix identifikatore.
Izvan datog bloka naredbi moe postojati druga varijabla sa istim imenom. Lokalna varijabla je validna unutar bloka naredbi u kome je definisana i u svim ugnijedenim blokovima, ako u njima nije redefinisana.
CREATE PROCEDURE scope() DEFINE x,y,z INT; LET x = 5; LET y = 10; LET z = x + y; --z je 15 BEGIN DEFINE x, q INT; DEFINE z CHAR(5); LET x = 100; LET q = x + y; -- q = 110 LET z = 'silly'; -- z dobija karakter vrijednost END LET y = x; -- y je sada 5 LET x = z; -- z je sada 15, a ne 'silly' END PROCEDURE;
Primjer.
Na poetku procedure scope()definisane su i inicijalizirane cjelobrojne varijable x, y, i z. Naredbe BEGIN i END oznaavaju ugnijedeni blok naredbi u kome su definisane cjelobrojne varijable x i q te CHAR varijabla z. Unutar ovog ugnijedenog bloka, redefinisana varijabla x maskira originalnu varijablu x. Iza END naredbe, koja oznaava kraj ugnijedenog bloka, ponovo je dostupna originalna vrijednost od x. Interni tipovi varijabli sadre podatke preuzete od internih (built-in) tipova podataka. Mogu se definisati SPL varijabla bilo kog internog tipa, osim SERIAL i SERIAL8, na primjer:
DEFINE DEFINE DEFINE DEFINE x INT; y INT8; name CHAR(15); today DATETIME YEAR TO DAY;
Varijabla za neki BLOB ili CLOB objekt (ili tip podatka koji sadri neki smart large object) ne sadri sam objekt nego pointer na taj objekt. Na primjer:
DEFINE a_blob BLOB; DEFINE b_clob CLOB;
Varijabla za simple large object (TEXT ili BYTE objekt) ne sadri sam objekt nego pointer na taj objekt. Pri definisanju varijabli TEXT ili BYTE tipa, mora se koristiti kljuna rije REFERENCES ispred tipa podatka, na primjer:
DEFINE t REFERENCES TEXT; DEFINE b REFERENCES BYTE;
Varijable koje treba da pohranjuju kolekcije preuzete iz baze podataka moraju biti jednog od slijedeih collection tipova: SET, MULTISET ili LIST. Collection varijabla ne moe biti globalna. Varijabla SET, MULTISET ili LIST tipa je collection varijabla koja pohranjuje kolekciju podataka iji je tip naveden u DEFINE naredbi. Primjer definisanja tipiziranih collection varijabli:
DEFINE a SET ( INT NOT NULL ); DEFINE b MULTISET ( ROW ( b1 INT, b2 CHAR(50)) NOT NULL ); DEFINE c LIST ( SET (DECIMAL NOT NULL) NOT NULL);
Elementi collection varijable se uvijek moraju definisati kao NOT NULL. U definiciji varijable, kompleksni tipovi podataka se mogu ugnjedavati u svim kombinacijama ili dubinama, da bi se prilagodili tipovima podataka pohranjenim u bazi podataka. Nije mogue dodjeljivanje collection varijable jednog tipa collection varijabli drugog tipa. Na primjer, ako se jedna collection varijabla definie kao SET, nije joj mogue dodijeliti vrijednost druge collection varijable MULTISET ili LIST tipa. 8
Varijable row tipa sadre podatke iz imenovanih ili neimenovanih row tipova. Moe se definisati imenovana ili neimenovana row varijabla.
CREATE ROW TYPE zip_t( z_code CHAR(5), z_suffix CHAR(4)); CREATE ROW street city state zip CREATE ROW name address salary TYPE address_t( VARCHAR(20), VARCHAR(20), CHAR(2), zip_t); TYPE employee_t ( VARCHAR(30), address_t INTEGER);
Ako se definie varijabla sa imenom imenovanog row tipa, ta varijabla moe prihvatiti samo podatke tog row tipa. Na primjer, slijedea varijabla person moe prihvatitit samo podatke employee_t tipa.
DEFINE person employee_t;
Varijabla koja pohranjuje podatke u neimenovanom row tipu se definie pomou kljune rijei ROW iza koje se navode polja tog row tipa, na primjer.
DEFINE manager ROW (name VARCHAR(30), department VARCHAR(30), salary INTEGER );
Neimenovani row tipovi se tipski provjeravaju samo na strukturnu jednakost pa varijabla definisana sa neimenovanim row tipom moe prihvatati podatke od svakog neimenovanog tipa koji ima isti broj polja istog tipa. Npr. varijabla manager moe primati podatke svakog od slijedeih row tipova:
ROW ( name VARCHAR(30), department VARCHAR(30), salary INTEGER ); ROW ( french spanish number ROW ( title musician price VARCHAR(30), VARCHAR(30), INTEGER ); VARCHAR(30), VARCHAR(30), INTEGER );
Varijabla row tipa se prije upotrebe mora inicijalizirati pomou LET ili SELECTINTO naredbe.
Varijable Opaque tipa prihvataju podatke preuzete od opaque tipova podataka, a varijable Distinct tipa od distinct tipova podataka. Ovakve varijable mogu prihvatati samo podatke definisanog tipa, na primjer:
DEFINE a point; DEFINE b centerpoint;
Klauzula LIKE 9
Kada se u definiciji varijable upotrijebi klauzula LIKE, server baze podataka varijabli dodjeljuje tip podatka jednak tipu koji ima navedena kolona tabele ili pogleda. Ako ta kolona sadri collection, row ili ugnijedeni kompleksni tip, varijabla e imati kompleksni ili ugnijedeni kompleksni tip definisan u toj koloni. Na primjer, varijabla loc1 definie tip podatka za locations kolonu u image tabeli.
DEFINE loc1 LIKE image.locations;
Varijabla tipa PROCEDURE U SPL rutini se moe definisati varijabla tipa PROCEDURE i dodijeliti joj ime neke postojee SPL rutine ili eksterne rutine. Takva varijabla predstavlja poziv korisniki definisane rutine, a ne ugraene (interne) rutine istog imena. Na primjer, varijabla length je definisana kao SPL procedura ili SPL funkcija, a ne kao ugraena LENGTH funkcija.
DEFINE length PROCEDURE; LET x = length( a,b,c );
Ova definicija iskljuuje ugraenu LENGTH funkciju unutar opsega datog bloka naredbi. Ovakva definicija se koristi ako ve postoji kreirana SPL ili eksterna rutina LENGTH. Napomena: Ako korisnik kreira SPL rutinu sa imenom jednakim imenu neke od agregatnih funkcija (SUM, MAX, MIN, AVG, COUNT) ili sa imenom extend, ime rutine se mora kvalifikovati pomou imena vlasnika.
Opsezi Opsezi se mogu koristiti sa variablama tipa CHAR, VARCHAR, NCHAR, NVARCHAR, BYTE i TEXT. Opseg oznaava pozicije poetnog i krajnjeg karaktera koji se koristi unutar varijable. Opsezi moraju biti konstantni. Za opsege se ne mogu koristiti varijeble.
DEFINE name CHAR(15); LET name[4,7] = 'Ream'; SELECT fname[1,3] INTO name[1,3] FROM customer WHERE lname = 'Ream';
KONFLIKT IMENA Ako se definie varijabla sa imenom jednakim nekoj SQL kljunoj rijei, moe doi do zabune. U sluaju jednakih imena vrijede slijedea pravila:
Definisane varijable imaju najvii prioritet. Rutine definisane kljunom rijei PROCEDURE u DEFINE naredbi imaju vii prioritet od SQL funkcija.
10
SQL funkcije imaju vii prioritet od SPL rutina koje postoje ali nisu identifikovane pomou kljune rijei PROCEDURE u DEFINE naredbi. Ako se nekoj SPL varijabli da ime jednako imenu neke kolone, server baze podataka podrazumijeva da svaka instanca tog identifikatora predstavlja tu varijablu. Da bi se isti identifikator upotrijebio za naziv kolone treba ga kvalifikovati imenom pripadne tabele u dot notaciji.
CREATE PROCEDURE table_test() DEFINE lname CHAR(15); LET lname = 'Miller'; SELECT customer.lname INTO lname FROM customer WHERE customer_num = 502; END PROCEDURE;
Na primjer, u slijedeoj SELECT naredbi, customer.lname je ime kolone a lname je ime varijable.
Ako se nekoj SPL varijabli da ime jednako imenu imenu neke SQL funkcije, server baze podataka podrazumijeva da svaka instanca tog identifikatora predstavlja tu varijablu i onemoguava upotrebu date SQL funkcije unutar bloka koda u kome je ta varijabla definisana. Slijedei primjer prikazuje blok unutar neke SPL procedure u kome je definisana varijabla user. Time je onemoguena upotreba USER funkcije unutar BEGINEND bloka.
CREATE PROCEDURE user_test() DEFINE name CHAR(10); DEFINE name2 CHAR(10); LET name = user; -- SQL funkcija BEGIN DEFINE user CHAR(15); -- onemoguena user funkcija LET user = 'Miller'; LET name = user; -- dodjeljuje 'Miller' varijabli name END LET name2 = user; -- SQL funkcija ponovo
11
Iako se globalna varijabla mora definisati sa podrazumijevanom vrijednou, ona se postavlja na podrazumijevanu vrijednost samo pri prvoj upotrebi. Ako se funkcije iz prethodnog primjera izvre slijedeim redom, vrijednost gvar e biti 4.
EXECUTE FUNCTION func1(); EXECUTE FUNCTION func2();
Informix Dynamic Server dozvoljava dodjeljivanje vrijednosti i varijablama tipa opaque, row, i polju row tipa. Svaki put kad se definie neka varijabla row tipa, ona se prije upotrebe mora inicijalizirati. Za pristup poljima row tipa koristi se dot notacija oblika variable.field ili variable.field.field.
Pretpostavimo da je definisan opaque tip point sa dvije vrijednosti koje definiu dvodimenzionalnu taku, ija je tekstualna reprezentacija '(x,y)'. Neka postoji i funkcija circum() koja izraunava obim kruga za zadatu taku '(x,y)' i radijus r. Tada se mogu deklarisati varijable i izvriti dodjeljivanja vrijednosti:.
DEFINE c point; DEFINE r REAL; DEFINE d REAL; LET c = '(29.9,1.0)'; --Dodjelivanje vrijednosti varijabli opaque tipa LET d = circum( c, r ); -- Dodjeljivanje vrijednosti vraene od -- funkcije circum()
12
Jednoj ili vie SPL varijabli je mogue dodijeliti rezultate izvravanja SPL ili eksternih funkcija pomou naredbi CALL ili EXECUTE PROCEDURE. Na primjer:
EXECUTE FUNCTION read_address('Smith') INTO p_fname, p_lname, p_add, p_city, p_state, p_zip; CALL read_address('Smith') RETURNING p_fname, p_lname, p_add, p_city, p_state, p_zip;
Eksplicitni blok naredbi omoguava definisanje varijabli ili obrada koje su validne samo unutar tog bloka naredbi. U slijedeem primjeru eksplicitni blok redefinie varijable definisane u implicitnom bloku.
CREATE FUNCTION block_demo() RETURNING INT; DEFINE distance INT; LET distance = 37; BEGIN DEFINE distance INT; LET distance = 2; END RETURN distance; END FUNCTION;
13
U ovom primjeru, implicitni blok naredbi definie varijablu distance i dodjeljuje joj vrijednost 37. Eksplicitni blok definie novu varijablu distance i dodjeljuje joj vrijednost 2. Ipak, naredba RETURN vraa vrijednost iz prve distance varijable, dakle 37.
Slijedei primjer kreira rutinu koja koristi FOREACH petlju za rad na employee tabeli.
CREATE_PROCEDURE increase_by_pct( pct INTEGER ) DEFINE s INTEGER; FOREACH sal_cursor FOR SELECT salary INTO s FROM employee WHERE salary > 35000; LET s = s + s * ( pct/100 ); UPDATE employee SET salary = s WHERE CURRENT OF sal_cursor; END FOREACH; END PROCEDURE;
Prethodna rutina izvrava slijdee zadatke unutar FOREACH petlje: deklarie kursor, selektuje jednu salary vrijednost iz employee, poveava selektovanu salary za zadati procenat, aurira employee sa tom novom salary, i dohvata slijedeu salary vrijednost Naredba SELECT je stavljena unutar kursora zato to iz date tabele dohvata sve plate vee od 35000. 14
Klauzula WHERE CURRENT OF u naredbi UPDATE aurira samo zapis na kome je kursor trenutno pozicioniran. Ova klauzula takoe automatski postavlja i kursor za auriranje (update cursor) na tekui zapis. Kursor za auriranje postavlja na trenutni zapis klju za auriranje (update lock) tako da ga drugi korisnici ne mogu aurirati dok se ne zavri ovo auriranje. SPL rutina e automatski postaviti kursor za auriranje ako neka UPDATE ili DELETE naredba unutar FOREACH petlje koristi WHERE CURRENT OF klauzulu. Ako korisnik upotrijebi WHERE CURRENT OF, onda mora eksplicitno imenovati kursor u FOREACH naredbi. Kada se koristi kursor za auriranje, moe se dodati BEGIN WORK naredba ispred FOREACH naredbe i COMMIT WORK naredba iza END FOREACH, na primjer:
BEGIN WORK; FOREACH sal_cursor FOR SELECT salary INTO s FROM employee WHERE salary > 35000; LET s = s + s * ( pct/100 ); UPDATE employee SET salary = s WHERE CURRENT OF sal_cursor END FOREACH COMMIT WORK;
Za svaku iteraciju FOREACH petlje, naredba COMMIT WORK potvruje posao uraen od BEGIN WORK naredbe te oslobaa klju sa auriranog zapisa.
Slijedea SPL rutina koristi IF-ELIF-ELSE strukturu za provjeru broja elemenata u SET-u atributa direct_reports i zavisno od rezultata te provjere poziva razliite eksterne rutine. 15
CREATE FUNCTION check_set( d SMALLINT ) RETURNING VARCHAR(30), VARCHAR(12), INTEGER; DEFINE name VARCHAR(30); DEFINE dept VARCHAR(12); DEFINE num INTEGER; SELECT mgr_name, department, CARDINALITY(direct_reports) FROM manager INTO name, dept, num WHERE dept_no = d; IF num > 20 THEN EXECUTE FUNCTION add_mgr(dept); ELIF num = 0 THEN EXECUTE FUNCTION del_mgr(dept); ELSE RETURN name, dept, num; END IF; END FUNCTION;
Funkcija cardinality() daje broj elemenata neke kolekcije. IF - ELIF - ELSE struktura u SPL rutini moe imati slijedea 4 dijela: IFTHEN uslov : ako je uslov iza IF naredbe ispunjen (TRUE), rutina izvrava naredbe u IF bloku, inae izvrava ELIF uslov. Jedna ili vie ELIF uslova (opciono): rutina provjerava ELIF uslov samo ako IF uslov nije ispunjen. Ako je ELIF uslov ispunjen, rutina izvrava naredbe u tom ELIF bloku, inae provjerava slijedei ELIF blok (ako postoji) ili izvrava ELSE naredbu. ELSE uslov (opciono): rutina izvrava naredbe u ELSE bloku ako nije ispunjen IF uslov niti bilo koji ELIF uslov. END IF naredba: zavrava ovaj blok naredbi.
SPL rutina test_rows prihvata cjelobrojni argument num te u WHILE petlji insertuje niz cjelobrojnih vrijednosti, od 1 do (num-1), u atribut numbers relacije table1. Treba paziti da se ne kreira beskonana petlja, kao na primjer:
CREATE PROCEDURE endless_loop() DEFINE i INTEGER; LET i = 1; WHILE ( 1 = 1 ) -- nemojte ovo napraviti!
16
LET i = i + 1; INSERT INTO table1 VALUES (i); END WHILE; END PROCEDURE;
FOR petlja se protee od naredbe FOR do naredbe END FOR i izvrava se u zadatom broju iteracija, definisan u FOR naredbi. Primjeri nekoliko naina definisanja iteracija u FOR petlji.
FOR i = 1 TO 10 END FOR; FOR i = 1 TO 10 STEP 2 END FOR; FOR i IN (2,4,8,14,22,32) END FOR; FOR i IN (1 TO 20 STEP 5, 20 to 1 STEP -5, 1,2,3,4,5) END FOR;
U prvom primjeru, SPL procedura izvrava FOR petlju sve dok je i izmeu 1 i 10, ukljuivo. U drugom primjeru, i se poveava od 1 na 3, 5, 7, itd, ali ne prelazi 10. Trei primjer provjerava da li je i unutar definiasanog seta vrijednosti. U etvrtom primjeru, SPL procedura izvrava petlju kada je i jednako 1, 6, 11, 16, 20, 15, 10, 5, 1, 2, 3, 4, ili 5 - dakle 11 puta, zato to lista ima dvije duple vrijednosti, 1 i 5. Glavna razlika izmeu WHILE i FOR petlje je ta da se FOR petlja garantovano zavrava, dok se za WHILE to ne moe rei. FOR naredba specificira egzaktan broj izvravanja petlje, osim ako neka naredba ne uzrokuje izlazak iz petlje. Sa WHILE je mogue kreirati beskonanu petlju.
1. Unijeti RETURNING klauzulu u naredbu CREATE PROCEDURE ili CREATE FUNCTION koja specificira broj vrijednosti koje funkcija vraa i njihove tipove podataka. 2. U tijelu funkcije unijeti naredbu RETURN koja eksplicitno vraa te vrijedosti. Uz definisanu RETURNING klauzule SPL funkcija moe vratiti vrijednosti koje odgovaraju specificiranim po broju i tipu, ili nikakve vrijednosti. Ako je definisana ova klauzula, a data SPL rutina zapravo ne vraa nikakve vrijednosti, ona se ipak smatra funkcijom. U tom sluaju, rutina vraa null vrijednost za svaku veliinu definisanu u RETURNING klauzuli. SPL funkcija moe vratiti varijable, izraze, ili rezultat drugog funkcijskog poziva. Ako funkcija vraa varijablu, ona joj prvo mora dodijeliti vrijednost. Svaka vrijednost koju vraa neka SPL funkcija moe biti duga do 32 KB.
Vraanje jedne vrijednosti Primjer kako SPL funkcija moe vratiti jednu vrijdnost.
CREATE FUNCTION increase_by_pct(amt DECIMAL, pct DECIMAL) RETURNING DECIMAL; DEFINE result DECIMAL; LET result = amt + amt * (pct/100); RETURN result; END FUNCTION;
Funkcija increase_by_pct prihvata dva argumenta tipa DECIMAL, iznos i procenat za koji ga treba poveati. RETURNING klauzula specificira da e funkcija vratiti jednu DECIMAL vrijednost. Naredba RETURN vraa DECIMAL vrijednost pohranjenu u result varijabli.
Vraanje vie vrijednosti SPL funkcija moe vratiti vie vrijednosti iz jednog zapisa neke relacije, na primjer:
CREATE FUNCTION birth_date( num INTEGER ) RETURNING VARCHAR(30), DATE; DEFINE n VARCHAR(30); DEFINE b DATE; SELECT name, bdate INTO n, b FROM emp_tab WHERE emp_no = num; RETURN n, b; END FUNCTION;
Gornja funkcija vraa dvije vrijednosti (ime i datum roenja) pozivnoj rutini iz jednog zapisa relacije emp_tab. U ovom sluaju, pozivna rutina mora biti spremna da prihvati povratne VARCHAR i DATE vrijednosti. Primjer SPL funkciju koja vraa vie vrijednosti iz vie zapisa.
CREATE FUNCTION birth_date_2( num INTEGER ) RETURNING VARCHAR(30), DATE; DEFINE n VARCHAR(30); DEFINE b DATE; FOREACH cursor1 FOR SELECT name, bdate INTO n, b FROM emp_tab
18
WHERE emp_no > num; RETURN n, b WITH RESUME; END FOREACH END FUNCTION;
SELECT naredba u SPL funkciji birth_date_2 dohavata dvije vrijednosti iz seta zapisa iji je emp_no vei od broja koji unese korisnik (num). Set zapisa koji zadovoljava dati uslov moe sadravati nijedan, jedan ili vie zapisa. Kako se moe desiti da naredba vrati vie zapisa, ona je smjetena unutar kursora. Napomena: Kada naredba nutar SPL rutine ne vrati niti jedan zapis, odgovarajuim SPL varijablama se dodjeljuje null vrijednost. Naredba RETURN koristi kljune rijei WITH RESUME. Kada se izvri RETURN WITH RESUME, kontrola se vraa pozivnoj rutini, ali se pri slijedeem pozivu iste SPL funkcije (pomou FETCH ili slijedee iteracije kursora u pozivnoj rutini), sve varijable u datoj SPL funkciji zadravaju iste vrijednosti, a izvravanje se nastavlja na naredbi neposredno iza RETURN WITH RESUME naredbe.
Ako SPL rutina vraa vie vrijednosti, pozivna rutina mora biti sposobna da ih obradi kroz kursor ili petlju. Ako je pozivna rutina neka SPL rutina, treba joj FOREACH petlja.
Drugim rijeima, izraz proj.name se prvo provjerava kao variable.field. Ako rutina ne pronae varijablu proj, ona provjerava izraz kao column.field. Ako rutina ne pronae kolonu (atribut) proj, ona provjerava isti izraz kao table.column.
19
SELECT naredba selektuje row iz salary atributa relacije emp_info u row varijablu row_var. Procedura emp_raise koristi SPL dot notaciju za direktan pristup do base polja varijable row_var. U ovom sluaju dot notacija znai variable.field. Procedura emp_raise preraunava vrijednost row_var.base kao(row_var.base * pct), a zatim aurira salary atribut relacije emp_info sa novom vrijednou row_var varijable. Napomena: Varijabla row tipa se mora inicijalizirati kao row prije nego to se njena polja mogu postavljati ili pozivati. Inicijalizacija se moe izvriti naredbom SELECTINTO ili LET.
9 Izvravanje rutina
SPL rutina se moe izvriti na jedan od slijedeih naina: Upotrebom samostalne EXECUTE PROCEDURE ili EXECUTE FUNCTION naredbe Eksplicitnim pozivom rutine iz druge SPL rutine Upotrebom naziva rutine unutar izraza u nekoj SQL naredbi
Upotreba EXECUTE naredbi Naredbe EXECUTE PROCEDURE i EXECUTE FUNCTION se mogu upotrijebiti samostalno iz SQL interaktivnog alata ili unutar neke SPL rutine.
EXECUTE PROCEDURE update_orders(); EXECUTE FUNCTION scale_rectangles(107, 1.9) INTO new; EXECUTE PROCEDURE informix@davinci:bsmith.update_orders();
Primjeri:
Upotreba CALL naredbe SPL rutina se moe pozvati iz neke SPL rutina pomou CALL naredbe. Primjer:
CALL area(rectv.length, rectv.width) RETURNING a;
20
Izvravanje rutina u izrazima Pozivi SPL rutina se mogu koristiti u izrazima. Primjer:
LET a = area( rectv.length, rectv.width ); CALL area( rectv.length, rectv.width ) RETURNING a; -- ove naredbe su ekvivalentne
Namjena
TIP
Broj SQL greke ili greke kreirane naredbom RAISE INTEGER EXCEPTION, koja se presree SPL varijabla koja prima broj nastale SQL greke SPL varijabla koja prima broj nastale ISAM greke ISAM error - Indexed Sequential Access Method greka, - greka operativnog sistema ili pristupa fajlu. 21 INTEGER INTEGER
error_data_var
CHAR
Naredba ON EXCEPTION zajedno sa RAISE EXCEPTION obezbjeuje mehanizam za presretanje i obradu greaka u SPL rutinama. U IN klauzuli se navodi lista brojeva greaka (SQL ili ISAM) koje e data ON EXCEPTION naredba presretati. Broj nastale greke se trai s lijeva na desno i zaustavlja na prvom pronaenom. Ako se IN klauzula ispusti, ON EXCEPTION naredba e presretati sve greke iz svog opsega. U tijelu ON EXCEPTION naredbe se definiu akcije koje e biti izvrene ako nastane greka. Opseg koji obrauje ON EXCEPTION naredbe je blok naredbi iza nje i svi blokovi ugnijedeni u naredne blokove. ON EXCEPTION je deklarativna naredba a ne izvrna. Zbog toga je treba unijeti prije bilo koje izvrne naredbe a poslije DEFINE naredbi SPL rutine. Jedan blok naredbi moe ukljuivati vie ON EXCEPTION naredbi. Kada nastane greka, server trai posljednju deklarisanu ON EXCEPTION naredbu koja presree nastalu greku. Ako je nae, izvrava kod u tijelu ON EXCEPTION naredbe Ako server ne nae ON EXCEPTION naredbu koja obrauje nastalu greku broj greke se dostavlja pozivnoj rutini (SPL rutini, aplikaciji, interaktivnom korisniku) i prekida izvravanje date SPL rutine. Nakon obrade nastale greke u pripadnoj ON EXCEPTION naredbi, mjesto od kojeg se nastavlja izvravanja SPL rutine zavisi od poloaja izvrene ON EXCEPTION naredbe, ako je ona: o unutar BEGINEND bloka, izvravanje se nastavlja sa prvom naredbom iza tog bloka, dakle iza opsega ON EXCEPTION naredbe; o unutar petlje (FOR, WHILE, FOREACH) preskae se ostatak petlje za tekuu iteraciju i poinje izvravanje naredne iteracije; o izvan blokova (odnosno u implicitinom bloku SPL rutine), izvrava se RETURN naredba bez argumenata te time vraa status uspjeno izvrene rutine bez povratne vrijednosti.
Ako se upotrijebi klauzula WITH RESUME, nakon obrade greke izvravanje SPL rutine se nastavlja na prvoj naredbi iza bloka (naredbe) koji je izazvao greku. Ako nastane greka unutar ON EXCEPTION naredbe, trai se rutina za obradu greke izvan tekue naredbe, radi izbjegavanja beskonane petlje. SET klauzula omoguava prihvat informacija o nastaloj greci u prethodno deklarisane lokalne varijable. Ako je navedena varijabla za prihvat ISAM greke a nastala greka nema pridruene ISAM greke, varijabli se dodjeljuje vrijednost nula(0). Slino, ako nema opisa za nastalu greku, string varijabli za njen prihvat se dodjeljuje prazan string. Nakon presretanja greke, rutinom ON EXCEPTION, status greke se brie. ON EXCEPTION naredba nema efekta u korisniki definisanim rutinama pozvanim od strane okidaa. 22
Namjena SPL varijabla ili izraz koji predstavlja broj SQL greke
TIP SMALLINT
SPL varijabla ili izraz koji predstavlja broj ISAM greke. SMALLINT Podrazumijevano je 0. SPL varijabla ili izraz koji sadri string sa opisom greke CHAR
Naredba RAISE EXCEPTION se koristi za simuliranje greke ili generisanje greke sa korisnikom porukom. Generisanu greku moe presresti ON EXCEPTION naredba. Ako se ispusti ISAM broj greke, server pri podizanju greke postavlja ISAM broj na 0. Ako se eli navesti error_text, bez navoenje ISAM broja greke, treba unijeti 0 za ISAM broj. Naredba RAISE EXCEPTION moe pokreuti sistemski-generisanu greku ili korisnikigenerisanu greku. Specijalni broj greke (-746) omoguava dostavljanje korisnikih poruka.
23