Baze podataka 1

Vežbe 11

Procedure

Storna procedura je spremljeni SQL kod koji se može sačuvati, tako da može biti korišćen iznova i iznova.

Primer: ako imamo neki SQL upit koji izvršavamo stalno, ili više DML i DQL naredbi koji izvršavamo sekvencijalno, možemo ih spakovati unutar procedure i onda pozivati nju umesto da pišemo isti kod ponovo.

Osobine:

CREATE PROCEDURE procedure_name
AS
BEGIN
  -- sql statement
END
GO;

Procedura moze imati i ulazne i izlazne parametre

CREATE PROCEDURE procedure_name(@par1 type, @par2 type, @par3 type OUTPUT)
AS
BEGIN
  -- sql statement
END
GO;

Primer poziva procedure

EXEC procedure_name @par1, @par2, @par3

Parametar oznacen sa OUTPUT, označava da se kroz njega može vratiti vrednost naredbi koja je pozvala proceduru.

Zadaci

Trigeri

Triger je storna procedura u bazi koja se automatski okida kada se specijalni dogadjaj u bazi desi.

Na primer, triger je može okinuti kada se red unese u specifičnu tabelu, kada se kolona neke tabele izmeni.

Trigeri ne mogu biti ručno pokrenuti, već samo kada se desi specifična akcija nad bazom.

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON TABLE     
{ AFTER | INSTEAD OF } -- kada se triger okida u odnosu na DML naredbu
{ INSERT, UPDATE, DELETE } -- koja DML naredba okida triger  
AS
BEGIN
  sql_statement
END

INSERTED i DELETED

DML trigeri koriste dve specijalne tabele, INSERTED i DELETED. SQL Server sam automatski kreirare ove tabele, i on ih održavati.

Zadaci

Kursori

Operacije u relacijskoj bazi podataka deluju na potpun skup redova. Na primer, skup redova koji se vraća SELECT naredbom sastoji se od svih redova koji zadovoljavaju uslove u WHERE klauzuli naredbe. Taj potpuni skup redova koji se vraća naredbom poznat je kao rezultujući skup. Aplikacije, posebno interaktivne online aplikacije, ne mogu uvek efikasno raditi sa celokupnim rezultujućim skupom kao jedinicom. Ove aplikacije zahtevaju mehanizam za rad sa jednim redom ili malim blokom redova u isto vreme. Kursori su proširenje rezultujućih skupova koji pružaju taj mehanizam

Kursor se definise nad upitom.

DECLARE @col1 type;
DECLARE @col2 type;
DECLARE @col3 type;

-- definisanje kursora
DECLARE cursor_name CURSOR FOR
SELECT col1, col2, col3 FROM table_name

-- otvaranje kursora za citanje
OPEN cursor_name

-- ucitavanje prvog reda
FETCH NEXT FROM cursor_name INTO @col1, @col2, @col3

WHILE @@FETCH_STATUS = 0
BEGIN
  -- telo jedne iteracije
  print concat(@col1, ' ', @col2, ' ', @col3)

  FETCH NEXT FROM cursor_name INTO @col1, @col2, @col3
END