Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

Proceduralni mehanizmi za kontrolu integriteta relacione baze podataka

Proceduralni mehanizmi za proveru uslova integriteta se, u sistemima za upravljanje bazom podataka,
najee realizuju korienjem okidaa (eng. trigger), procedura (eng. stored procedures) i funkcija
baza podataka.
1. Okidai (trigeri)
Okida je mehanizam SUBP koji se automatski pokree i izvrava svaki put kada se izvri odreena
operacija auriranja nad tabelom za koju je vezan triger. Okidai se najee koriste za realizaciju
poslovnih pravila koji se tiu provere integriteta podataka i/ili obezbeenja konzistentnog stanja baze
podataka.
Pri kreiranju okidaa obavezno se navode predmet i vrsta auriranja koja bi trebala aktivirati okida.
Predmet auriranja je uvek neka tabela (ili pogled), a pod vrstom auriranja se podrazumevaju razliite
operacije auriranja, kao to su unos, modifikacija ili brisanje podataka. Uobiajeno je da se za svaku
operaciju auriranja nad nekom tabelom definie poseban okida, mada je teoretski mogue koristiti
isti okida za sve tri operacije auriranja. Ono to ne moe, jeste da se za istu operaciju auriranja nad
jednom tabelom definie vie okidaa.
Okida obino slui za proveru ili izmenu podataka pomou odgovarajuih SQL iskaza i ne bi trebao vraati
neku vrednost(i) korisniku.
DDL iskazi koji se koriste za rad sa okidaima su CREATE TRIGGER, ALTER TRIGGER i DROP
TRIGGER.

CREATE TRIGGER trigger_name
ON { table | view }
{ { FOR | AFTER | INSTEAD OF } { [DELETE] [,] [INSERT] [,] [UPDATE] }
AS
[ { IF UPDATE ( column )
[{ AND | OR } UPDATE ( column )]
[ ...n ] } ]
sql_statement [ ...n ]
}
FOR | AFTER | INSTEAD OF
Kljune rei koje odreuju vreme aktiviranja okidaa u odnosu na operaciju auriranja. Navodi se
jedna od tri opcija.
FOR | AFTER
FOR i AFTER imaju isti efekat. Kljuna re FOR je zaostavtina iz prolosti koja je sauvana
zbog kompatibilnosti sa prethodnim verzijama SUBP. Danas se u osnovi razlikuju tri vrste
okidaa: AFTER, BEFORE i INSTEAD OF od kojih SQL-Server podrava samo 2 vrste
(AFTER i INSTEAD OF). AFTER okida se aktivira tek nakon uspenog izvrenja operacija
auriranja. Ukoliko se pojavi neki problem pri izvrenju operacije auriranja okida se nee ni
pokrenuti.





INSTEAD OF
Govori da e se okida izvravati umesto okidajueg SQL iskaza. Koristi se kada se izvrenje
operacije auriranja uslovljava ispunjenou nekih preduslova, pa se u telu okidaa prvo
proverava ispunjenost ovih uslova pa tek onda izvrava sama operacija auriranja. Ovo
auriranje se vri na osnovu sadraja logikih tabela koje se automatski formiraju pri
aktiviranju okidaa (vie o njima kasnije).
[DELETE] [,] [INSERT] [,] [UPDATE]
Kljune rei koje specificiraju koje operacije auriranja podataka, kada se izvre nad specificiranom
tabelom ili pogledom, aktiviraju okida. Najmanje jedna opcija mora biti navedena.
AS
Kljuna re koja oznaava poetak tzv. tela okidaa u kome se navode akcije koje okida treba da
preduzme pri sopstvenom aktiviranju.

Telo okidaa
sql_statement
Okidai mogu sadrati proizvoljan broj i vrste Transact-SQL iskaza. Pored generikih SQL iskaza (DDL i
DML iskazi) u okidau se mogu koristiti i naredbe kontrole toka kao i druge naredbe svojstvene
strukturalnim programskim jezicima (naredbe dodeljivanja vrednosti (SET),...). Rad sa okidaima je
povezan sa korienjem nekoliko specijalnih tabela:
deleted i inserted su logike (konceptualne) tabele. One su strukturalno identine tabeli nad kojom je
okida definisan i sadre stare ili nove vrednosti torki koje su obuhvaene operacijom auriranja koja je
aktivirala okida. Na primer, da bi se pretraile sve vrednosti u deleted tabeli, treba koristiti sledeu
naredbu:
Primer:
SELECT * FROM deleted
IF UPDATE (column)
Testira da li je izvrena INSERT ili UPDATE operacija nad specificiranom kolonom. Moe se navesti vie
kolona.
UPDATE(column) se moe koristiti bilo gde unutar tela okidaa.
Napomene: Ukoliko postoje ogranienja definisana nad trigerovanom tabelom, ona se proveravaju posle izvrenja
INSTEAD OF okidaa, odnosno pre izvrenja AFTER okidaa. Ukoliko doe do naruavanja ogranienja,
akcije INSTEAD OF okidaa se ponitavaju (rollback), dok se AFTER okida uopte ne izvrava.
SQL Server dozvoljava kreiranje vie okidaa za istu operaciju auriranja podataka (DELETE, INSERT ili
UPDATE). Na primer, ukoliko se nad nekom tabelom koja ve ima UPDATE okida izvri iskaz CREATE
TRIGGER FOR UPDATE kreirae se dodatni update okida.
Primer:
CREATE TRIGGER ispit_i
ON ispit
FOR INSERT, UPDATE
AS
IF UPDATE(ocena)
UPDATE student
SET prosek = (SELECT avg(ispit.ocena)
FROM ispit JOIN inserted ON ispit.bro_dos=inserted.bro_dos
WHERE ispit.ocena>5),
brisp = (SELECT count(*)
FROM ispit JOIN inserted ON ispit.bro_dos=inserted.bro_dos
WHERE ispit.ocena>5)
WHERE bro_dos=(SELECT bro_dos FROM inserted)


DECLARE
{{ @local_variable data_type }
| { @cursor_variable_name CURSOR }
} [ ,...n]
Promenljivama se vrednost dodeljuje pomou SET ili SELECT iskaza. Kursorske varijable se mogu koristiti
samo u iskazima koji se tiu rada sa kursorima. Nakon deklaracije sve varijable imaju NULL vrednost.
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
Boolean_expression
Je izraz koji vraa TRUE ili FALSE. Ukoliko sadri SELECT iskaz isti se mora navesti u zagradama.
{sql_statement | statement_block}
Ukoliko se IF ili ELSE grana odnosi samo na jedan SQL iskaz ovaj iskaz se moe navesti odmah iza IF ili
ELSE. Ukoliko se u nekoj grani mora izvriti vie od jedne naredbe ove naredbe treba grupisati kao blok
iskaza. Blok iskaza se definie pomou kljunih rei BEGIN (za oznaavanje poetka) i END (za
oznaavanje zavretka bloka).
Primer:
CREATE TRIGGER ispit_if
ON ispit
FOR INSERT, UPDATE
AS
DECLARE @ocena tinyint, @bro_dos char(10), @sif_pre char(4);
IF update(ocena)
BEGIN
SELECT @ocena=ocena, @bro_dos=bro_dos, @sif_pre=sif_pre FROM inserted
IF @ocena<6
BEGIN
RAISERROR ('Ocena studenta sa brojem dosijea %s iz predmeta sa sifrom %s nije zadovoljavajuca!', 16, 1,
@bro_dos, @sif_pre)
ROLLBACK TRANSACTION
END
END
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement

Rezultat bilo koje SELECT naredbe predstavlja neki skup torki. Ukoliko rezultujui skup ini samo jedna
torka, tada e vrednost promenljivih, za koje je u SELECT klauzuli specificirana dodela vrednosti, biti
jednaka vrednosti odgovarajuih izraza u rezultujuoj torci. Ako je rezultujui skup torki prazan skup, tada
se promenljivama dodeljuje NULL vrednost. Meutim, ako se rezultujui skup sastoji od vie torki, tada e
vrednost promenljivih po izvrenju SELECT naredbe biti jednaka vrednosti odgovarajuih izraza u
poslednjoj selektiranoj torki. Na ovaj nain se gubi informacija o vrednostima izraza za sve ostale torke
rezultujueg skupa. Ukoliko je neophodno znati vrednosti za sve selektirane torke, a postoji mogunost da
rezultujui skup ini vie torki, koriste se kursori.
Rad sa kursorima obino podrazumeva sledee korake:
1. DECLARE - Deklaracija kursora pri kojoj se kursoru pridruuje neki SELECT iskaz i definiu
karakteristike kursora (npr. da li se torke u kursoru mogu modifikovati ili ne).
2. OPEN - Otvaranje kursora koje podrazumeva izvravanje pridruenog SELECT iskaza i popunjavanje
kursora torkama rezultujueg skupa.


3. FETCH - Pregled torki u kursoru (pristup narednoj ili, eventualno, prethodnoj torki se naziva fetch-om).
4. Opcionalno, modifikaciju tekue torke.
5. CLOSE - Zatvaranje kursora.
INSENSITIVE
Definie kursor koji pravi privremenu kopiju podataka koje koristi kursor. Kursor se nakon punjenja
iskljuivo koristi podacima iz ove privremene tabele (koja se kreira u tempdb bazi), te se izmene koje su u
meuvremenu uinjene nad baznim tabelama ne reflektuju na podatke koji se dobijaju pregledom kursora.
Ovakav kursor ne dozvoljava modifikaciju torki rezultujueg skupa. Ukoliko se izostavi kljuna re
INSENSITIVE, (commit-ovana) brisanja i modifikacije nad baznim tabelama e se reflektovati pri
narednim fetch-ovima.
SCROLL
Specificira da su sve fetch opcije (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) na
raspolaganju. Ukoliko nije naveden SCROLL jedina podrana fetch opcija je NEXT.
select_statement
Je standardni SELECT iskaz koji definie rezultujui skup kursora.
READ ONLY
Onemoguuje vrenje modifikacija na osnovu sadraja kursora (koje je, inae, dozovoljeno po default-u).
Kursor se ne moe referencirati u WHERE CURRENT OF klauzuli UPDATE ili DELETE iskaza.
UPDATE [OF column_name [,...n]]
Definie kolone koje se mogu modifikovati unutar kursora. Ukoliko se koristi OF column_name [,...n],
modifikacije je mogue vriti samo nad navedenim kolonama. Ukoliko se navede samo UPDATE bez
navoenja liste kolona, sve kolone se mogu modifikovati.
OPEN cursor_name
Otvaranje kursora podrazumeva izvravanje SQL naredbe definisane prilikom deklaracije kursora i
podrazumeva popunjavanje kursora torkama rezultujueg skupa izvrene SQL naredbe. Po otvaranju kursora
aktuelna torka je prva torka rezultujueg skupa.
Naredni primer prikazuje otvaranje kursora i pregled torki unutar kursora.
Primer:
DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName
FROM AdventureWorks2012.HumanResources.vEmployee
WHERE LastName like 'B%';

OPEN Employee_Cursor;

FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor
END;

CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;





FETCH
[ [ NEXT | PRIOR | FIRST | LAST]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
FETCH omoguava pristup torkama koje se nalaze u kursoru. Pomou FETCH naredbe moemo biti
sigurni da e svaka torka koja se nalazi u kursoru proi odreene modifikacije zadate u telu trigera.
NEXT predstavlja defaultnu fetch opciju. Podrazumeva prisutp svakoj torci respektivno. Prvim
fetch-om pristupa se prvoj torci, zatim drugoj Postupak se ponavlja sve dok se ne doe do poslednje
torke.
PRIOR - podrazumeva prisutp, obradu, predhodne torke. Kursor se pozicionira tako da uvek pristupa
predhodnoj torci i za nju daje rezultate. U sluaju da se radi o prvom fetch-u (pristup prvoj torci) kao
rezultat promenljive e imati null vrednost i kursor e se pozicionirati na prvu torku. Tek pristupom
drugoj torci, doi e do obrade prve torke.
FIRST pozicioniranje na prvu torku u kursoru.
LAST pozicioniranje na poslednju torku u kursoru.

CLOSE {cursor_name | cursor_variable_name }
Zatvara otvoren kursor to podrazumeva pranjenje kursora (oslobaa se memorijski prostor koji se
koristio za uvanje podataka kursora), ali njegova deklaracija ostaje i dalje aktuelna, te se zatvoren
kursor uvek moe ponovo otvoriti.
DEALLOCATE { cursor_name | @cursor_variable_name }
Ponitava deklaraciju kursora. Ukoliko se ovo ne bi uradilo prilikom sledeeg aktiviranja okidaa bi
nastao problem usled nemogunosti ponovne deklaracije kursora sa istim nazivom.
@@FETCH_STATUS
Predefinisana (sistemska) varijabla koja vraa status poslednjeg FETCH iskaza nad aktivnim
kursorom.
Return
vrednost
Opis
0 FETCH iskaz je bio uspean.
-1 FETCH iskaz nije uspeo ili je torka izvan rezultujueg skupa.
-2 Fetch-ovana torka ne postoji.







Primer:
DECLARE authors_cursor CURSOR FOR
SELECT au_lname FROM authors
WHERE au_lname LIKE "B%"
ORDER BY au_lname

OPEN authors_cursor

-- Perform the first fetch.
FETCH NEXT FROM authors_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM authors_cursor
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
U veini programskih jezika, while petlja je naredba koja doputa iterativno izvrenje koda u zavisnosti od
ispunjenosti datog bulovskog uslova. While petlja se moe shvatiti kao ponavljajua IF naredba. Sastoji se od
uslova i bloka koda. Uslov je definisan na samom poetku petlje i ukoliko je logiki taan (ispunjen), kod
unutar bloka se izvrava. Posle svakog izvrenja bloka koda (iteracije petlje) ponovo se proverava ispunjenost
uslova. Izvrenje bloka koda se ponavlja sve dok je uslov ispunjen. S obzirom da while petlja proverava uslov
pre izvrenja bloka koda, ova upravljaka struktura je poznata kao pred-test petlja. U nekim situacijama postoji
potreba za postavljanjem dodatnih uslova unutar bloka koda koji mogu dovesti do nasilnog prekida izvravanja
petlje (BREAK). U sluaju navoenja iskaza CONTINUE nasilno se prekida dalje izvrenje ostatka bloka koda i
inicira se ponovna provera ispunjenosti opteg uslova izvrenja petlje.
2. Procedure baze podataka (stored procedures)
Uskladitene procedure se mogu definisati kao kolekcija Transact - SQL iskaza koje mogu da vrate odreene
rezultate na osnovu prosleenih parametara od strane korisnika. Uskladitene procedure se prevashodno koriste
za neke standardne obrade koje podrazumevaju neka izraunavanja i auriranje sadraja nekih tabela (obraun
kamata na bankarske raune, obraun zarada,). Ovi postupci obrade su mogu opisati i pomou programa
pisanim u nekom od programskih jezika ali je prednost korienja uskladitenih procedura u tome to se one
mnogo bre izvravaju.
Kod procedura baza podataka postoje dve vrste parametara: input i output parametri. Input parametri su
korisniki prosleeni parametri koji slue za zadavanje uslova u samom telu procedure. Pomou njih zadaju se
odreeni uslovi koji e izdvojiti torke (podatke) za obradu. Output parametri su parametri koji se vraaju
izvravanjem tela procedure. Oni predstavljaju prikaz rezultata obrade podataka pomou uskladitenih
procedura.




Postoje dve osnovne vrste procedura - sistemske procedure i korisniki definisane procedure baze podataka.
a) Sistemske procedure
U SQL Serveru, mnoge administrativne i informativne aktivnosti mogu se obavljati pomou sistemskih
procedura. Svaki put kada se doda ili izmeni tabela, napravi rezervna kopija baze podataka (backup), kreira
login, korisnik, dodeljuju korisnika prava ili obavljaju druge administratorske aktivnosti, zapravo se pozivaju
sistemske procedure specijalno napisane da izvre eljenu aktivnost. Sistemske procedure imaju prefiks sp_ i
ine deo SQL Server instalacije. uvaju se u master bazi podataka i dostupne su za korienje u bilo kojoj bazi
podataka.
b) Korisniki definisane procedure
Korisniki definisana procedura je svaki program napisan od strane korisika u SQL Server okruenje iji je
prevashodni zadatak auriranje sadraja nekih tabela na osnovu obraenog sadraja drugih tabela. Za razliku od
sistemskih procedrua, korisniki definisane procedure se uvaju u lokalnoj bazi i samo su u njoj dostupne za
korienje.
Primer:
CREATE PROCEDURE GetImmediateManager
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
END
Kao to se vidi iz gore navedenog primera emploeeID predstavlja input parametar dok managerID predstavlja
output parametar. Ova procedura vraa vrednost za parametar (managerID), na osnovu navedene vrednosti u
parametru (employeeID).
U veini sluajeva se prilikom pozivanja procedura navode vrednosti za parametre, ali je mogue da se ne
navedu vrednosti parametara. U tom sluaju se kao vrednost parametra uzima njegova podrazumevana
(defaultna) vrednost.
Primer:
CREATE PROCEDURE uspGetAddress @City nvarchar(30) = Belgrade
AS
SELECT *
FROM AdventureWorks.Person.Address
WHERE City = @City
U gore navedenom primeru ukoliko korisnik pokrene ovu proceduru bez ekspilictnog navoenja vrednosti za
parametre, procedura e koristiti podrazumevane vrednosti, te prikazati sve adrese koje se nalaze u tabeli
Address gde je kao vrednost za kolonu City naveden Belgrade.





CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type } [ OUTPUT ] ]
[ ,...n ]
AS sql_statement [ ...n ]
procedure_name definisanje naziva procedure koja se kreira
@parameter data_type navoenje parametara koji e se koristiti u telu procedure
OUTPUT naglaavanje output parametra
AS - kljuna re koja slui za oznaavanje poetka tzv. tela procedure u kome se navode akcije koje procedura
treba da preduzme pri njenom pozivu od strane korisnika. Svi Transact-SQL iskazi koji se mogu navesti u telu
okidaa stoje na raspolaganju i pri pisanju tela procedure. Za razliku od okidaa kod procedura ne postoje
inserted i deleted logike tabele, jer se procedure kao takve ne vezuju za konkretnu tabelu.
Primer:
CREATE PROCEDURE OrderSummary @MaxQuantity INT OUTPUT AS

SELECT Ord.EmployeeID, SummSales = SUM(OrDet.UnitPrice * OrDet.Quantity)
FROM Orders AS Ord
JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID)
GROUP BY Ord.EmployeeID
ORDER BY Ord.EmployeeID

SELECT @MaxQuantity = MAX(Quantity) FROM [Order Details]

RETURN (SELECT SUM(Quantity) FROM [Order Details])
[ [ EXEC [ UTE ] ]
[ @return_status = ] { procedure_name }
[ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
@ return_status - promenljiva koja uva status procedure. Ova promenljiva mora biti deklarisana u telu
uskladitene procedure.
@ procedure_name - naziv procedure koja treba da se izvri.

@ procedure_name_var koristi se kada je naziv koji predstavlja uskladitenu proceduru definisan pomou
lokalne promenljive.

@ parametar navode se vrednsti za input parametre koji se koriste u telu procedure.

@ variable - navode se vrednsti lokalnih varijabli koje predstavljaju input parametre pozivane procedure.

OUTPUT - navodi se kada uskladitena procedura vraa vrednsoti za output parametre. Koristite ovu kljunu
re kada koristite kursorske promenljive kao parametri. Ne moete da izvravate proceduru navodei izlaz za
parametar koji nije definisan kao izlaz parametar u CREATE PROCEDURE saoptenju.



DEFAULT korienje podrazumevane vrednost za input parametre.


Primer:
DECLARE @OrderSum INT
DECLARE @LargestOrder INT

-- Execute the procedure, which returns the result set from the first SELECT.
EXEC @OrderSum = OrderSummary @MaxQuantity = @LargestOrder OUTPUT

-- Use the return code and output parameter.
PRINT 'The size of the largest single order was: ' +
CONVERT(CHAR(6), @LargestOrder)
PRINT 'The sum of the quantities ordered was: ' +
CONVERT(CHAR(6), @OrderSum)
DROP PROCEDURE { procedure_name } [ ,...n ]
Naredba za brisanje korisniki definisane procedure.
3. Funkcije baze podataka
Kao i funkcije u programskim jezicima, SQL Server korisniki definisane funkcije su rutine koje prihvataju
parametre, izvravaju razliite iskaze i vraaju rezultate tih iskaza kao vrednosti. Povratna vrednost moe biti
jedna skalarna vrednost ili skup rezultata. Postoje sistemske i korisniki definisane funkcije baze podataka.
Sistemske funkcije su uskladitene u master bazi i ne mogu se menjati. Kao primeri sistemskih funkcija mogu se
navesti funkcije COUNT, SUM, DATEPART, GETDATE,.
Bilo da se radi o sistemskim ili korisniki definisanim funkcijama, funkcije se mogu podeliti na:
a) Skalarne - korisniki definisani skalarne funkcije vraaju jednu vrednost podataka kao rezultat funkcije.
Ukoliko telo funkcije sadri vie od jednog iskaza isti se moraju navesti kao blok iskaza. Povratna
vrednost moe biti bilo koji tip podataka, osim teksta, nteksta, slika, kursora i vremenskih tipova
podataka.
b) Table valued funkcije predstavljaju korisniki definisani funkcije koje vraaju tabele kao rezultat rada
funkcije.
Primer:
CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
RETURNS int
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret int;
SELECT @ret = SUM(p.Quantity)
FROM Production.ProductInventory p
WHERE p.ProductID = @ProductID
AND p.LocationID = '6';
IF (@ret IS NULL)
SET @ret = 0;
RETURN @ret;
END;


Navedeni primer prikazuje vieiskaznu skalarnu funkciju. Funkcija prihvata vrednost ulaznog parametra
ProductID i vraa ukupnu koliinu tog proizvoda na zalihama na lokaciji iji je ID 6.




Primer:
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
Navedeni primer prikazuje table valued funkciju. Funkcija prihvata vrednost ulaznog parametra storeID i vraa
kolone ID proizvoda, naziv i ukupnu prodaju na godinjem nivou.
Pozivanje funkcije:
SELECT * FROM Sales.ufn_SalesByStore (602);
Razlike izmeu procedura i funkcija baza podataka:
Procedure Funkcije
Moe i ne mora vraati vrednosti. Mora vratiti neku vrednost.
Sve DML naredbe su dozvoljene. Od DML naredbi mogu se koristiti samo SELECT
naradba, dok naredbe vezane za auriranje
podataka (insert, update, delete) nisu dozvoljene.
Ne podrava postojanje i ulaznih i izlaznih
parametara.
Podrava postojanje i ulaznih i izlaznih
parametara.
Ne postoji mogunost korienja tr-catch
blokova.
Postoji mogunost korienja tr-catch blokova.
Mogu se koristiti transakcije u okviru
uskladitenih procedura.
Nisu dozvoljene transkacije u okviru funkcija.
Mogu se korisiti i privremene tabele i tabele kao
varijable.
Ne postoji mogunost kreiranja privremenih
tabela. Tabele se mogu koristiti samo kao
varijable.
Uskladitene procedure mogu pozvati funkcije. Uskladitena procedura ne moe biti pozvana iz
tela funkcije.
Uskladitene procedure ne mogu biti pozvane iz
SELECT, WHERE, HAVING, naredbi.
Funkcije mogu biti pozvane u SELECT naredbi.
Ne moe se korisiti u JOIN klauzuli. Mogu se koristiti u JOIN klauzuli kao skup
rezultata.

You might also like