You are on page 1of 23

Informix SPL

kratko uputstvo
(Interni dopunski prirunik za LV iz Baza podataka na FE Tuzla)

mr.sc. Emir Mekovi

Tuzla, novembar 2012.

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

Definisanje i upotreba varijabli .................................................................................................... 7

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

Izvravanje rutina ....................................................................................................................... 20

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.

2 Uvod u SPL Rutine


SPL rutina je generiki termin koji ukljuuje SPL procedure i SPL funkcije. SPL procedura je rutina napisana u SPL-u i SQL-u koja ne vraa vrijednost. SPL funkcija je rutina napisana u SPL-u i SQL-u koja vraa neku vrijednost Za pisanje SPL rutina koriste se SQL i SPL naredbe. SPL naredbe se mogu koristiti samo unutar naredbi : CREATE PROCEDURE, CREATE PROCEDURE FROM, CREATE FUNCTION i CREATE FUNCTION FROM.

3 Pisanje SPL rutina


SPL rutina se sastoji od: poetne naredbe, bloka naredbi i zavrne naredbe. Unutar bloka naredbi se mogu koristiti SQL i SPL naredbe. Maksimalna veliina SPL rutine je 64 KB. (ukljuivo SPL globalne varijable i samu rutinu).

3.1 Poetak i kraj rutine


SPL procedura (funkcija) poinje naredbom CREATE PROCEDURE (CREATE FUNCTION) a zavrava kljunim rijeima END PROCEDURE (END FUNCTION), npr.:
CREATE PROCEDURE new_price( per_cent REAL ) END PROCEDURE; CREATE FUNCTION discount_price(per_cent REAL) RETURNING MONEY; END FUNCTION;

3.2 Ime SPL rutine


Ime SPL rutine se navodi odmah iza CREATE PROCEDURE ili CREATE FUNCTION . Ime SPL procedure moe biti dugo do 18 karaktera, i vrijede pravila za Informix identifikatore. Informix Dynamic Server dozvoljava kreiranje vie SPL rutina sa istim imenom ali razliitim parametrima (rutina overloading). Na primjer, u jednoj bazi podataka se mogu kreirati rutine:
CREATE PROCEDURE multiply (a INT, b FLOAT) CREATE PROCEDURE multiply (a INT, b SMALLINT) CREATE PROCEDURE multiply (a REAL, b REAL)

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.

3.3 Parametri rutine


Svaka SPL rutina ima listu sa nula ili vie parametara, navedenih u zagradama iza imena rutine. Parametar ima ime i tip podatka, te moe imati definisanu podrazumijevanu vrijednost. Parametri ne mogu biti tipa: SERIAL, SERIAL8, TEXT i BYTE Primjeri razliitih listi parametara:
CREATE PROCEDURE raise_price(per_cent INT) CREATE FUNCTION raise_price(per_cent INT DEFAULT 5) CREATE PROCEDURE update_emp(n employee_t) CREATE FUNCTION update_nums(list1 LIST (ROW a varchar(10), b varchar(10), c int) NOT NULL )

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

3.4 Return klauzula


Unutar SPL funkcije mora se unijeti klauzula return koja vraa jednu ili vie vrijednosti. Za speficiranje return klauzule, koristi se RETURNING ili RETURNS kljuna rije sa listom tipova podataka koje rutina vraa (bilo koji SQL tip osim SERIAL, SERIAL8, TEXT i BYTE), npr.:
CREATE FUNCTION find_group(id INT) RETURNING INT, REAL; END FUNCTION;

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.5 Definisanje tipa SPL funkcije


SPL funkcije su podrazumijevano tipa variant. Funkcija je tipa variant ako vraa razliite rezultate kada se poziva sa istim argumentima ili ako modifikuje stanje baze podataka ili varijable. Na primjer, funkcija koja vraa tekui datum ili vrijeme je variant funkcija. Ako se pri kreiranju funkcije navede modifikacija WITH NOT VARIANT, takva funkcija ne moe sadravati nikakve SQL naredbe.

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.

3.7 Klauzule DOCUMENT i WITH LISTING IN


Klauzule DOCUMENT i WITH LISTING IN se navode neposredno iza naredbi END PROCEDURE ili END FUNCTION. DOCUMENT dodaje komenatar uz SPL rutinu, koji se moe dohvatiti iz sistemskih tabela.
CREATE FUNCTION raise_prices(per_cent INT) END FUNCTION DOCUMENT "USAGE: EXECUTE FUNCTION raise_prices (xxx)", "xxx = percentage from 1 - 100";

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).

3.9 Primjer kompletne rutine


Slijedea CREATE FUNCTION naredba kreira rutinu koja ita adresu korisnika:
CREATE FUNCTION read_address (lastname CHAR(15)) -- jedan argument RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(15),CHAR(2), CHAR(5); -- deklarisanje vraanja 6 podataka DEFINE p_lname, p_fname, p_city CHAR(15); --definisanje varijabli DEFINE p_add CHAR(20); DEFINE p_state CHAR(2); DEFINE p_zip CHAR(5); SELECT fname, address1, city, state, zipcode INTO p_fname, p_add, p_city, p_state, p_zip FROM customer WHERE lname = lastname; RETURN p_fname, lastname, p_add, p_city, p_state, p_zip; -- vraanje 6 podataka END FUNCTION; DOCUMENT 'Rutina prima prezime korisnika te vraa puno ime i adresu', WITH LISTING IN 'pathname' - unijeti put do fajla u koji zelite -- snimiti upozorenja kompajlera ; -- kraj rutine read_address

3.10 Kreiranje SPL rutine iz tekstualnog fajla


Tekst koda rutine se moe smjestiti u ASCII fajl nakon ega se rutina moe kompajlirati naredbom CREATE PROCEDURE FROM ili CREATE FUNCTION FROM kojoj se kao argument daje ime fajla sa kodom rutine. Na primjer, ako se gornji kod rutine read_address nalazi u fajlu read_add_source, slijedea naredba e kompajlirati rutinu read_address:
CREATE PROCEDURE FROM 'read_add_source';

3.11 Brisanje SPL rutine


Nakon kreiranja SPL rutine, nije mogue mijenjati njeno tijelo. Umjesto toga, ona se mora izbrisati i ponovo kreirati. Kreirane rutine se briu iz baze podataka naredbom DROP PROCEDURE ili DROP FUNCTION, na primjer.
DROP PROCEDURE raise_prices; DROP FUNCTION read_address;

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.

4 Definisanje i upotreba varijabli


Svaka varijabla koja se koristi u SPL rutini, osim varijabli koje su imlicitno definisane u listi parametara, mora se definisati u tijelu rutine. Vrijednost varijable se dri u memoriji; varijabla nije objekt baze podataka. Stoga, ponitavanje transakcije (rolling back) ne restaurira vrijednosti SPL varijabli. Za definisanje varijabli u SPL rutini koristi se naredba DEFINE koja se unosi iza naredbe CREATE PROCEDURE i ispred bilo kojih drugih naredbi. Primjeri korektne definicije varijabli:
DEFINE a INT; DEFINE person person_t; DEFINE GLOBAL gl_out INT DEFAULT 13;

Jedna SPL varijabla ima ime i tip podatka. Za ime varijable vrijede pravila za Informix identifikatore.

4.1 Lokalne varijable


Varijabla se moe definisati kao lokalna ili globalna po opsegu. U SPL rutini, lokalne varijable: su validne samo u toku SPL rutine, resetuju se na inicijalne ili korisniki dostavljene vrijednosti, pri svakom izvravanju rutine, i ne mogu imati podrazumijevane vrijednosti Lokalne varijable mogu biti slijedeih tipova: interni tipovi podataka (osim SERIAL, SERIAL8, TEXT ili BYTE) proireni tipovi podataka (row, opaque, distinct ili collection) koji su definisani u datoj bazi podataka prije izvravanja date SPL rutine Opseg lokalne varijable je blok naredbi u kome je deklarisana. 7

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);

Pretpostavimo da su definisani imenovani row tipovi :

CREATE TABLE employee OF TYPE employee_t;

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';

Primjer upotrebe opsega sa varijablom tipa CHAR(15).

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;

Uopteno, treba izbjegavati upotrebu ANSI-rezervisanih rijei za imena varijabli.

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

4.2 Deklarisanje globalnih varijabli


Globalna varijabla ima vrijednost pohranjenu u memoriji i dostupna je drugim SPL rutinama, pokrenutim u istoj korisnikoj sesiji, na istoj bazi podataka. Globalna varijabla ima slijedee karakteristike: Zahtijeva podrazumijevanu vrijednost. Moe se koristiti u bilo kojoj SPL rutini, mada mora biti definisana u svakoj rutini u kojoj se koristi. Prenosi svoju vrijednost iz jedne SPL rutine u drugu do kraja sesije. Collection varijabla se ne moe definisati kao globalna.

Primjer dvije SPL funkcije koje dijele jednu globalnu varijablu.


CREATE FUNCTION func1() RETURNING INT; DEFINE GLOBAL gvar INT DEFAULT 2; LET gvar = gvar + 1; RETURN gvar; END FUNCTION; CREATE FUNCTION func2() RETURNING INT; DEFINE GLOBAL gvar INT DEFAULT 5; LET gvar = gvar + 1;

11

RETURN gvar; END FUNCTION;

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();

Alo ako se izvre obrnutim redom, vrijednost gvar e biti 7.


EXECUTE FUNCTION func2(); EXECUTE FUNCTION func1();

4.3 Dodjeljivanje vrijednosti varijablama


Ako se nekoj varijabli ne dodijeli vrijednost, ta varijabla ima nedefinisanu vrijednost. Nedefinisana vrijednost se razlikuje od null vrijednosti. Pri pokuaju upotrebe varijable sa nedefinisanom vrijednou nastaje greka. Varijebli u SPL rutini se vrijednost moe dodijeliti upotrebom: LET naredbe. SELECTINTO naredbe. CALL naredbe sa procedurom koja ima RETURNING klauzulu. EXECUTE PROCEDUREINTO ili EXECUTE FUNCTIONINTO naredbe.

4.3.1 Naredba LET


Uz LET naredbu moe se unijeti jedno ili vie imena varijabli sa jednim znakom jednakosti (=) i validnim izrazom ili imenom funkcije. Svi slijedei primjeri su validne LET naredbe.
LET LET LET LET LET a = b = a,b a,b d = 5; 6; LET c = 10; = 10,c+d; = (SELECT cola,colb FROM tab1 WHERE cola=10); func1(x,y);

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

4.3.2 Ostali naini dodjele vrijednosti varijablama


Naredba SELECT se moe upotrijebiti za dohvatanje vrijednosti iz baze podataka i njihovo direktno dodjeljivanje varijablama, na primjer.
SELECT fname, lname INTO a, b FROM customer WHERE customer_num = 101

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;

5 Izrazi u SPL rutinama


U SPL rutinama se mogu koristiti svi SQL izrazi, osim agregatnih izraza. Primjeri korektnih izraza:
var1 var1 + var2 + 5 read_address('Miller') read_address(lastname = 'Miller') get_duedate(acct_num) + 10 UNITS DAY fname[1,5] || ''|| lname '(415)' || get_phonenum(cust_name)

6 Pisanje bloka naredbi


Svaka SPL rutina ima barem jedan blok naredbi, koji ini grupa SQL i SPL naredbi izmeu CREATE i END naredbi. Unutar bloka naredbi mogu se koristiti sve SPL naredbe i sve dozvoljene SQL naredbe. Lista SQL naredbi koja nije dozvoljena unutar SPL bloka naredbi se moe nai u opisu bloka naredbi u Informix Guide to SQL: Syntax.

6.1 Implicitni i eksplicitni blok naredbi


Implicitni blok naredbi jedne SPL rutine se protee od kraja CREATE naredbe do poetka END naredbe. Eksplicitni blok naredbi se definie unosom kljune rijei BEGIN na poetku bloka i kljune rijei END na kraju bloka, na primjer:
BEGIN DEFINE distance INT; LET distance = 2; END

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.

6.2 Upotreba kursora


Petlja FOREACH definie kursor, specifian identifikator koji pokazuje na jedan element u nekoj grupi elemenata, bilo grupi vrsta (rows) ili elemenata neke kolekcije. Petlja FOREACH deklarie i otvara kursor, dohvata zapise ili kolekciju iz baze podataka, obrauje svaki element u grupi, i na kraju zatvara kursor. Kursor se mora deklarisati ako SELECT, EXECUTE PROCEDURE, ili EXECUTE FUNCTION naredba moe vratiti vie od jedne vrste (row). Nakon deklaracije kursora, naredbe SELECT, EXECUTE PROCEDURE, ili EXECUTE FUNCTION se smjetaju unutar njega. SPL rutina koja vraa grupu vrsta se naziva kursor rutina zato to se mora koristiti kursor za pristupanje podacima koje ona vraa. SPL rutina koja ne vraa nikakvu vrijednost, vraa jednu vrijednost, ili bilo koju drugu vrijednost koja ne zahtijeva kursor se naziva nekursor rutina. U FOREACH petlji se moe upotrijebiti EXECUTE FUNCTION ili SELECT.INTO naredba za izvravanje eksterne funkcije koja predstavlja neku iterator funkciju.

6.3 Upotreba FOREACH petlje za definisanje kursora


FOREACH petlja poinje kljunom rijei FOREACH a zavrava sa END FOREACH. Izmeu FOREACH i END FOREACH moe se deklarisati kursor ili upotrijebiti EXECUTE PROCEDURE ili EXECUTE FUNCTION. Primjeri struktura FOREACH petlji.
FOREACH cursor FOR SELECT column FROM table INTO variable; END FOREACH; FOREACH EXECUTE FUNCTION name() INTO variable; END FOREACH;

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.

6.4 Upotreba IF - ELIF - ELSE strukture


SPL rutina u slijedeem primjeru koristi jednu IF-ELIF-ELSE strukturu za komparaciju svoja dva argumenta.
CREATE FUNCTION str_compare( str1 CHAR(20), str2 CHAR(20)) RETURNING INTEGER; DEFINE result INTEGER; IF str1 > str2 THEN result = 1; ELIF str2 > str1 THEN result = -1; ELSE result = 0; END IF RETURN result; END FUNCTION;

Pretpostavimo da je definisana tabela manager:


CREATE TABLE manager ( mgr_name VARCHAR(30), department VARCHAR(12), dept_no SMALLINT, direct_reports SET( VARCHAR(30) NOT NULL ), projects LIST( ROW ( pro_name VARCHAR(15), pro_members SET( VARCHAR(20) NOT NULL ) ) NOT NULL), salary INTEGER, );

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.

6.5 WHILE i FOR petlje


WHILE petlja poinje WHILE uslovom i zavrava sa END WHILE. Rutina izvrava blok naredbi unutar petlje sve dok je ispunjen uslov u WHILE naredbi.
CREATE PROCEDURE test_rows( num INT ) DEFINE i INTEGER; LET i = 1; WHILE i < num INSERT INTO table1 (numbers) VALUES (i); LET i = i + 1; END WHILE; END PROCEDURE;

Primjer WHILE petlja.

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.

6.6 Izlazak iz petlje


U petljama FOR, FOREACH i WHILE se mogu koristiti naredbe CONTINUE i EXIT za kontrolu izvravanja petlje. CONTINUE uzrokuje da rutina preskoi naredbe u ostatku petlje i pree na slijdeu iteraciju FOR petlje. EXIT zavrva izvravanje petlje i uzokuje da rutina nastavi izvravanjem prve naredbe iza END FOR. Uz EXIT se dodaje naziv petlje na koju se primjenjujena primjer, EXIT FOR ili EXIT FOREACH.
FOR i = 1 TO 10 IF i = 5 THEN CONTINUE FOR; ELIF i = 8 THEN EXIT FOR; END IF; END FOR;

Primjeri za CONTINUE i EXIT u jednoj FOR petlji.

7 Vraanje vrijednosti iz SPL funkcije


SPL funkcija moe vratiti jednu ili vie vrijednosti. Da bi SPL funkcija vratila vrijednosti, u nju treba ukljuiti slijedea dva dijela: 17

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.

8 Rukovanje podacima Row tipa


U SPL rutini se mogu koristiti imenovni i neimenovani row tipovi kao definicije parametara, argumenti, definicije varijabli, i povratne vrijednosti. Slijedei primjer definie row tip salary_t i relaciju emp_info, koji se koriste u nastavku.
CREATE ROW TYPE salary_t(base MONEY(9,2), bonus MONEY(9,2)) CREATE TABLE emp_info (emp_name VARCHAR(30), salary salary_t);

Relacija emp_info sadri atribute za imena uposlenih i podatke o njihovoj plati.

8.1 Prioritet Dot notacije


Na Dynamic Server-u, vrijednost koja koristi dot notaciju (npr. proj.name) u SQL naredbi unutar SPL rutine ima jedno od tri znaenja, slijeim redom:

variable.field column.field table.column

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

8.2 Auriranje izraza Row tipa


U SPL rutini se moe upotrijebiti row varijabla za auriranje izraza row tipa. Slijedei primjer prikazuje SPL proceduru emp_raise upotrijebljenu za auriranje relacije emp_info kada se osnovna plata uposlenog povea za neki procenat.
CREATE PROCEDURE emp_raise( name VARCHAR(30), pct DECIMAL(3,2) ) DEFINE row_var salary_t; SELECT salary INTO row_var FROM emp_info WHERE emp_name = name; LET row_var.base = row_var.base * pct; UPDATE emp_info SET salary = row_var WHERE emp_name = name; END PROCEDURE;

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

Primjer upotrebe u SQL izrazu.


CREATE FUNCTION raise_price ( num INT ) RETURNING DECIMAL; DEFINE p DECIMAL; SELECT increase_by_pct(price, 20) INTO p FROM inventory WHERE prod_num = num; RETURN p; END FUNCTION;

10 Obrada greaka u pohranjenim procedurama


Naredba ON EXCEPTION Sintaksa

Element error_number SQL_error_var ISAM_error_var

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

SPL varijabla koja prima string sa opisom greke

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

Naredba RAISE EXCEPTION Sintaksa

Element SQL_error_var ISAM_error error_text

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.

SVE TO NEMA U OVOM PRIRUNIKU MOETE NAI U LITERATURI NAVEDENOJ NA POETKU.

23

You might also like