Sunteți pe pagina 1din 21

Laborator BD- Utilizarea procedurilor stocate in programarea

SQL
Ce sunt si cand folosim procedurile stocate
O procedura stocata (Stored Procedure) este un program compilat si stocat pe un server de baze
de date, local sau la distana, care poate executa comenzi SQL. O procedura stocata este un
obiect al bazei de date, gestionat de DBMS. O procedura stocata poate primi sau transfera
parametri si poate furniza rezultate. Ea incapsuleaza comenzi SQL si instruciuni de manipulare
a datelor scrise in limbajul T-SQL (Transact SQL). O aplicaie client, sau o alta procedura
stocata utilizeaza directiva SQL, exec, pentru a apela procedura.
Inainte de a crea o procedura stocata trebuie sa cunoastem cand este recomandata folosirea ei. O
procedura stocata este recomandata a se utiliza in urmatoarele situaii:
existenta unui numar mare de clieni la care codul aplicaiei se distribuie;
daca se doreste imbunatatirea performanelor aplicaiei;
aplicaia client necesita multe operaii cu baza de date, dar puine intervenii ale
utilizatorului;
codul aplicaiei client se schimba frecvent;
aplicaia client executa multe interogari SQL;
aplicaia client acceseaza variabile de mare importana, pentru care se impune garantarea
securitaii si integritaii, motiv pentru care accesul la codul aplicaiei client se impune a
fi strict controlat;
codul aplicaiei client are un cost mare de intreinere.
Procedurile stocate rezolva situaiile prezentate mai sus, avand urmatoarele avantaje:
Execuie precompilata. SQL Server compileaza fiecare procedura stocata o data si apoi
reutilizeaza planul de execuie stabilit, ceea ce conduce la o imbunataire seminificativa
a performanelor atunci cand o procedura stocata este apelata in mod repetat. O
procedura stocata incapsuleaza multe instruciuni si directive SQL ale aplicaiei intr-un
singur mesaj ce va fi transmis serverului sql (la un apel exec), reducand astfel traficul
prin reea la o singura operaie send-receive pentru mai multe instruciuni SQL, si in
consecinta micsorand costurile de executie si latimea de banda pentru comunicare intre
client si server;
Trafic redus client/server. Utilizarea procedurilor stocate face ca in reea sa se transmita
un mesaj format dintr-o singura linie, cea care solicita execuia unei anumite proceduri
stocare (eventual cu parametrii de intrare necesari), in locul interogarilor propriu-zise,
care pot genera mesaje de dimensiune mare. Procedurile stocate constituie o modalitate
mai comoda de a crea interogari sau taskuri complexe ce pot fi apelate de cate ori e
nevoie;
Cost redus. Costul de intreinere a unei proceduri stocate este mai mic decat al unui

program convenional, reducand astfel si costul de intreinere al aplicaiei client;


Reutilizarea codului. Procedurile stocate pot fi folosite de mai muli utilizatori si
aplicaii client. Utilizarea lor intr-o maniera corecta va conduce la un timp redus de
dezvoltare a aplicaiilor;
Executie centralizata. Procedurile stocate elimina aplicaiile SQL realizate pe staiile de
lucru, inlaturand pericolul accesului la coninutul unor variabile de mare importana de
catre utilizatori;
Imbunatairea securitaii. Pot fi atribuite utilizatorilor drepturi de execuie a
procedurilor stocate independent de permisiunile asociate tabelelor. Asupra procedurilor
stocate pot fi setate drepturi de acces, independent de cele care au fost asupra celorlalte
elemente ale bazei de date (tabele, indecsi, vizualizari etc.);
Apelul altor proceduri stocate. In cadrul unei proceduri stocate exista posibilitatea de a
face referina la alte proceduri stocate, ceea ce determina posibilitatea de execuie
inlanuita a acestora;
Flexibilitatea codului. Facilitatea de a folosi un set suplimentar de instruciuni faa de
standardul SQL, determina cresterea flexibilitaii programelor realizate cu acest
instrument. De asemenea, instruciunile condiionale sau repetitive permit construcia
unor adevarate programe de manipulare a bazelor de date;
Interogari parametrizate. Posibilitatea de utilizare a variabilelor determina, printre
altele, facilitatea de a construi interogari SQL parametrizabile.
In proiectarea unei proceduri stocate trebuie avute in vedere urmatoarele doua restricii de baza:
Mai multe proceduri stocate pot avea acelasi nume daca numarul de parametri este
diferit. Nu se admit proceduri stocate diferite cu acelasi nume si acelasi numar de
parametri, chiar daca tipul parametrilor este diferit.
Procesul de apel al unei proceduri stocate nu trebuie terminat din interiorul procedurii
stocate, chiar daca acest lucru este permis de mediul de execuie. Aceasta decizie trebuie
sa o ia programul apelant.

Tipuri de proceduri stocate


In Microsoft SQL Server 20012 sunt disponibile mai multe tipuri de proceduri stocate:

1.Proceduri stocate definite de utilizator


Procedurile stocate sunt module sau rutine care incapsuleaza cod pentru a putea fi reutilizat. O
procedura stocata poate avea parametrii de intrare, parametrii de iesire, poate sa intoarca
rezultate scalare sau tabele si chiar mesaje pentru client. Procedurile stocate folosesc sintaxa
DDL (Data Definition Language) sau DML (Data Manipulation Language). in Microsoft SQL
Server 2005, o procedura stocata poate fi de 2 tipuri: Transact-SQL sau CLR.
procedura stocata Transact-SQL este o colecie salvata de enunuri Transact-SQL,
care poate lua si returna parametrii furnizai de utilizatori. De exemplu, o procedura
stocata poate conine enunurile necesare pentru a insera o noua linie in unul sau mai
multe tabele bazandu-se pe o informaie furnizata de aplicaia client sau procedura

stocata poate returna date din baza de date catre aplicaia client. De exemplu, o aplicaie
web, gen ecommerce poate folosi o procedura stocata pentru a returna informaii despre
produsele specifice bazare pe un criteriu de cautare specificat de un utilizator conectat
online.
procedura stocata CLR este o referina catre o metoda Common Language Runtime
(CLR) scrisa in limbajele platformei Microsoft .NET Framework, care poate accepta si
returna parametrii furnizai de utilizator. Acestea sunt implementate ca metode publice,
statice intr-o clasa din limbajul .NET Framework.

2. Proceduri stocate extinse


Aceasta caracteristica va fi eliminata in versiunile viitoare de Microsoft SQL Server. Se
recomanda evitarea folosirea acestor proceduri, metoda recomandata fiind integrarea CLR.
Procedurile stocate extinse sunt de fapt rutine, programe scrise in limbaje de programare, ca de
exemplu C, ce sunt apoi compilate in DLL-uri care sunt atasate la baza de date. Procedurile
stocate extinse ruleaza direct in spaiul de adrese a unei instane SQL Server si sunt programate
folosind API-ul SQL Server Extended Stored Procedure.

3. Proceduri stocate sistem


Procedurile stocate sistem formeaza un tip special de procedura, folosita pentru a realiza multe
activitai administrative in SQL Server 2005. Procedurile stocate sistem sunt fizic stocate in
Resource database si au prefixul sp_. Logic, ele apar in schema sys a fiecarei baze de date
sistem sau baza de date definite de utilizator.
Exista proceduri de sistem care permit obtinerea unor informatii importante privind procedurile
sau executia acestora. Printre cele mai importante astfel de proceduri stocate de sistem, pot fi
amintite:
sp_depends - ofera informatii privind despre dependenta intre obiecte, de exemplu
numele vederilor sau procedurilor care depind de un tabel sau vedere specificata ori
numele tabelelor sau vederilor de care depinde procedura specificata.
sp_helptext - tipareste textul de definitie al procedurii specificate.
sp_procoption - seteaza optiunile specifice unei proceduri. Apelul aceste proceduri:
sp_procoption [ @ProcName = ] 'nume_procedura'
, [ @OptionName = ] 'optiune'
, [ @OptionValue = ] 'valoare'

unde:
'optiune' - singura valoare acceptata a acestui argument este startup care permite ca
procedura stocata sa fie declarata "cu autoexecutie" (autoexecution). O procedura
stocata cu autoexecutie este executata imediat dupa pornirea sistemului Microsoft
SQL ServerTM .
'valoare' - poate fi una dintre valorile true, false sau on, off.
Pentru o lista completa a procedurilor stocate sistem se poate apela Books online.

In SQL Server 20012, se pot aplica drepturi gen: GRANT, DENY si REVOKE la procedurile
stocate.

Construirea procedurilor stocate folosind limbajul procedural


Transact-SQL
Transact-SQL este un limbaj procedural incorporat in standardul ANSI/ISO, permiand gasirea
de soluii de reutilizare a codului. Limbajul Transact-SQL este un limbaj simplu, structurat bloc,
care ofera posibilitai de gestionare a erorilor. Sintaxa sa permite setarea variabilelor, utilizare
de structuri de decizie si repetitive, fiind astfel familiar oricarui programator cu experienta intrun limbaj procedural convenional.
Limbajul SQL permitea doar accesul si un anume control asupra bazelor de date. Folosind
Transact-SQL avem un mod de a procesa datele si de a include operaii logice, fara a avea
nevoie sa scriem programe convenionale. SQL PL este recunoscut de SQL Management
Studio, de declansatori (triggers), de funcii utilizator si proceduri stocate si este manevrat,
impreua cu datele de catre SQL Management Studio. O procedura scrisa in Transact-SQL este
inregistrata in SQL Management Studio care executa acea procedura..
Pentru a crea o procedura stocata, este obligatoriu ca utilizatorul sa se conecteze la baza de date,
si apoi va expanda Programmability. Aici se gasesc toate functionalitatile care pot fi create
pentru o baza de date (proceduri stocate, functii, triggeri, tipuri noi etc.).

Figura 1. Ilustrarea functionalitatilor Programability

Pentru a crea o noua procedura, se apasa clic dreapta si se face optiunea New Stored Procedure.

Forma generala a unei proceduri


Crearea unei proceduri stocate se realizeaza cu instruciuni DDL, CREATE PROCEDURE. intreg
codul procedurii este parte a directivei DDL Create Procedure. Instruciunea Create
Procedure identifica procedura prin nume, parametri de definire si ali parametri care se aplica
procedurii in sine. Corpul procedurii este inclus intre cuvintele cheie BEGIN si END. in interiorul
corpului, in prima parte se dispun instruciunile DECLARE,pentru a se declara variabilele
folosite, inainte de utilizarea lor in procedura. Partea de programare conine fluxul logic al
procedurii si setarea parametrilor de iesire, care urmeaza dupa instruciunea DECLARE
corespunzatoare.
Structura unei proceduri stocate scrisa folosind T- SQL este:
CREATE PROCEDURE numeprocedura(lista parametri)
BEGIN
DECLARE <variabile>
...
<partea logica>

END

...

Lista de parametri conine 0 sau mai muli parametri. Fiecare parametru va fi prezent in lista
sub forma:
tip nume_parametru tip_data.

Pentru tip se poate specifica unul dintre urmatoarele doua tipuri posibile:
1.

IN

parametru de intrare; valoarea lui nu poate fi modificata in interiorul corpului


procedurii

2.

OUT

parametru de iesire

Nume_parametru este similar cu numele oricarei variabile in limbage de programare, iar


tip_data va specifica tipul de data al parametrului respectiv. Acesta poate fi unul dintre tipurile
de data admise pentru coloanele unui tabel.
Sintaxa completa:
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ ...n ] | <method_specifier> }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name

Explicatii argumente:
schema_name este schema de care apartine procedura;
procedure_name este numele noii proceduri stocate. Numele procedurii trebuie sa fie
conforme cu normele de identificare si trebuie sa fie unic in schema de care apartine
; number este un numar intreg optional care este folosit pentru a grupa procedurile cu
acealsi nume. Procedurile grupate pot fi sterse impreuna.
@parameter este un parametru in procedura. Pot fi declarati unul sau mai multi
parametrii. Valoarea pentru fiecare parametru declarat trebuie sa fie furnizata de
utlizator cind este apelata procedura, daca nu este setata o valoare implicita. O
procedura stocata poate avea maxim 2100 parametrii. Numele oricarui parametru incepe
cu @ si trebuie sa fie conform cu normele de identificare. Parametrii sunt vizibili local
in cadrul unei proceduri. Acelasi nume de parametru poate fi folosit in alte proceduri.

[ type_schema_name. ] data_type este tipul de data al parametrului si schema de care


apartine. Toate tipurile de date pot fi folosite pentru parametrii, cu exceptia tipului table.
VARYING specifica multimea de rezultate suportate ca un parametru de iesire. Acest
parametru este construit dinamic de procedura stocata si continutul ei poate varia. Se
aplica doar parametrilor cursor.
Default este valoarea implicita pentru parametru.
OUTPUT specifica daca un parametru este de iesire.
EXECUTE AS specifica contextul de securitate sub care se executa procedura stocata.
<sql_statement> reprezinta una sau mai multe instructiuni Transact-SQL care sunt
incluse in procedura
Pentru mai multe detalii poate fi accesat Books online.
Pentru a executa o procedura stocata se foloseste cuvintul cheie exec.
Exemplu 1. Exemplu de procedura stocata fara parametru:
Create procedure all_employees
As select * from employees
Exec all_employees

Exemplu 2. Exemplu de procedura stocata cu parametrii de intrare:


Create procedure proc4(@p1 char(15), @p2 char(20), @p3 int)
As insert into Workers values (@p1,@p2,@p3)

Exemplu 3. Exemplu este pentru crearea de versiuni ale procedurii:


Create procedure proc3;1 as
Print Version1
Create procedure proc3;2 as
Print Version2
Proc3;1
Version1
Proc3;2
Version2
Proc3
Version1

; si numarul intreg de dupa numarul procedurii permite creare de versiuni multiple ale
procedurilor cu acelasi nume. Cand procedura este executata, numarul versiunii poate fi

specificat pentru controlul versiunii. Daca nu este specificata versiunea, va fi executata prima
procedura.
Exemplu de procedura stocata care va intoarce toti angajatii din baza de date AdventureWorks.
Instructiunea DROP se refera la stergerea unei proceduri si va fi explicata detaliat mai tirziu.
USE AdventureWorks;
GO
IF OBJECT_ID ( 'HumanResources.usp_GetAllEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.usp_GetAllEmployees;
GO
CREATE PROCEDURE HumanResources.usp_GetAllEmployees
AS
SELECT LastName, FirstName, JobTitle, Department
FROM HumanResources.vEmployeeDepartment;

GO

Pentru rularea procedurii se foloseste instructiunea:


EXECUTE HumanResources.usp_GetAllEmployees;

Exemplu de procedura stocata cu parametru, care va returna doar angajatul specificat din baza
de date AdventureWorks.
USE AdventureWorks;
GO
IF OBJECT_ID ( 'HumanResources.usp_GetEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.usp_GetEmployees;
GO
CREATE PROCEDURE HumanResources.usp_GetEmployees
@lastname varchar(40),
@firstname varchar(20)
AS
SELECT LastName, FirstName, JobTitle, Department
FROM HumanResources.vEmployeeDepartment
WHERE FirstName = @firstname AND LastName = @lastname;

GO

Pentru rulare se pot folosi urmatoarele instructiuni.


EXECUTE HumanResources.usp_GetEmployees 'Ackerman', 'Pilar';
--sau
EXEC HumanResources.usp_GetEmployees @lastname = 'Ackerman', @firstname =
'Pilar';
GO
-- sau
EXECUTE HumanResources.usp_GetEmployees @firstname = 'Pilar', @lastname =
'Ackerman';
GO
-- sau

HumanResources.usp_GetEmployees 'Ackerman', 'Pilar';

Modificarea unei proceduri stocate existente in baza de date


Pentru modificarea unei proceduri stocate existente se va utiliza comanda ALTER.
Sintaxa completa:
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
[ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS
{ <sql_statement> [ ...n ] | <method_specifier> }
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME
assembly_name.class_name.method_name

Argumentele sunt in mare partea aceleasi cu cele de la instructiunea CREATE


PROCEDURE.
Exemplu de creare a unei porceduri stocate numita usp_vendor_info_all, care va
returna
numele
tututor
vinzatorilor
care
furnizeaza
produsul
Adventure Works Cycles, rata de credit si
disponibilitatea lor.
use AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.usp_vendor_info_all', 'P' ) IS NOT NULL

DROP PROCEDURE dbo.usp_vendor_info_all;


GO
CREATE PROCEDURE dbo.usp_vendor_info_all
WITH ENCRYPTION
AS
SELECT v.Name AS Vendor, p.Name AS 'Product name',
v.CreditRating AS 'Credit Rating',
v.ActiveFlag AS Availability
FROM Purchasing.Vendor v
INNER JOIN Purchasing.ProductVendor pv
ON v.VendorID = pv.VendorID
INNER JOIN Production.Product p
ON pv.ProductID = p.ProductID;
GO

Exemplu de modificare a porcedurii stocate numita usp_vendor_info_all, pentru


a furniza toti vinzatorii care funizeaza vopsele, care au o
rata de creditare excelenta si sunt disponibili in acest
moment. Se va folosi functia CASE care va fi prezentata
ulterior in detaliu.
ALTER PROCEDURE dbo.usp_vendor_info_all
@product varchar(25)
AS
SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name',
'Credit rating' = CASE v.CreditRating
WHEN 1 THEN 'Superior'
WHEN 2 THEN 'Excellent'
WHEN 3 THEN 'Above average'
WHEN 4 THEN 'Average'
WHEN 5 THEN 'Below average'
ELSE 'No rating'
END
, Availability = CASE v.ActiveFlag
WHEN 1 THEN 'Yes'
ELSE 'No'
END
FROM Purchasing.Vendor v
INNER JOIN Purchasing.ProductVendor pv
ON v.VendorID = pv.VendorID
INNER JOIN Production.Product p
ON pv.ProductID = p.ProductID
WHERE p.Name LIKE @product
ORDER BY v.Name ASC;

GO
Pentru rulare se poate folosi urmatoarea constructie deoarece nu este specificata optiunea
WITH ENCRYPTION.
USE AdventureWorks;
GO
SELECT definition FROM sys.sql_modules
WHERE object_id = OBJECT_ID('dbo.usp_vendor_info_all');

Stergerea unei proceduri stocate existente in baza de date


Stergerea unei proceduri se realizeaza utilizand comanda DROP. Sintaxa completa:
DROP { PROC | PROCEDURE } { [ schema_name. ] procedure } [ ,...n ]

Cu argumentele:
schema_name este numele schemei de care apartine procedura. Nu poate fi
specificat un nume de server sau un nume de baza de data
procedure este numele procedurii stocate sau a grupului de proceduri stocate care
se doresc a fi sterse
Exemplu: sterge cele doua versiunii ale procedurii proc 3, create mai sus.

procedure proc3

Procedurile stocate pot fi clasificate funcie de numarul instruciunilor pe care le conine


corpul procedurii. Astfel, putem avea:
Proceduri simple proceduri formate dintr-o singura instruciune. in acest caz
instruciunile BEGIN / END, care delimiteaza corpul procedurii, lipsesc.
Proceduri compuse proceduri ce conin un bloc de instruciuni incluse intre

BEGIN

si

END.

Instruciuni simple si compuse


O multime de instruciuni (bloc) cuprinse intre BEGIN si END formeaza o instruciune
compusa. Instruciunile din interiorul unei instruciuni compuse se numesc instruciuni
simple. O instruciune simpla o intalnim si in cadrul procedurilor simple.
Ordinea instruciunilor intr-o instruciune compusa (bloc) este cea indicata in structura
generala a unei proceduri stocate adica: declarare de variabile, de condiii SQL, de
handlere de tratare a erorilor si instruciuni care formeaza corpul instruciunii compuse.

Instruciunea DECLARE
Instruciunea DECLARE este folosita in proceduri stocate pentru declararea variabilelor
locale, a condiiilor, a cursorilor si a handlerelor de tratare a erorilor.
Sintaxa completa:

DECLARE
{{ @local_variable [AS] data_type }
| { @cursor_variable_name CURSOR }
| { @table_variable_name < table_type_definition > }
} [ ,...n]
< table_type_definition > ::=
TABLE ( { < column_definition > | < table_constraint > } [ ,... ]
)
< column_definition > ::=
column_name { scalar_data_type | AS computed_column_expression }
[ COLLATE collation_name ]
[ [ DEFAULT constant_expression ] | IDENTITY [ ( seed,increment ) ] ]
[ ROWGUIDCOL ]
[ < column_constraint > ]
< column_constraint > ::=
{ [ NULL | NOT NULL ]
| [ PRIMARY KEY | UNIQUE ]
| CHECK ( logical_expression )
}
< table_constraint > ::=
{ { PRIMARY KEY | UNIQUE } ( column_name [ ,... ] )
| CHECK ( search_condition )
}

Argumentele:

@local_variable este numele variabilei locale declarate. Numele variabilei trebuie


sa inceapa cu semnul @.

data_type reprezinta tipul de date asociat variabilei. O variabila nu poate avea ca


tip de data text, ntext sau image.

@cursor_variable_name este numele variabilei cursor. Numele variabilei trebuie


sa inceapa cu semnul @.

CURSOR specifica ca variabila este o variabila locala de tip cursor.

@table_variable_name reprezinta numele unei variabile de tip table. Numele


variabilei trebuie sa inceapa cu semnul @.

table_type_definition defineste tipul de date table. Declararea tabelului include


definirea coloanelor, numele, tipurile de date si constrangerile asociate. Singurele
tipuri de constrangere permise sunt PRIMARY KEY, UNIQUE, NULL, si
CHECK.

Pentru informatii detaliate trebuie studiat Books online.

1.Declararea variabilelor locale


Variabilele locale sunt variabilele utilizate de procedurile stocate. Ele sunt utilizate pentru a salva

parametri in timpul procesului de execuie sau pentru a permite efectuarea unor calcule de catre procedura
stocata . Tipurile pentru aceste variabile sunt aceleasi cu tipurile de date care pot apare pe coloanele unei
tabele, adica toate subtipurile pentru tipurile numeric, alfanumeric, data si timp. Numele variabilelor in
MS SQL Server incepe totdeauna cu @.

Sintaxa instruciunii de declarare a unei variabile locale este:


DECLARE

{{ @local_variable [AS] data_type }

Specificarea valorii DEFAULT este opionala. Implicit valoarea sa este NULL.


Exemple de declarare a unor variabile locale:
DECLARE @v_mcod INTEGER DEFAULT 3;
DECLARE @c_data DATE;
DECLARE @vnume CHAR(35);

O problema care apare in legatura cu variabilele locale dintr-o procedura stocata este cea
a ambiguitaii numelui. Ambiguitatea apare atunci cand o variabila are acelasi nume cu o
coloana.

2. Declararea variabilelor globale


Variabilele globale nu sunt definite prin rutine, ci sunt definite la nivel de server. Se pot
folosi doar variabile globale predeclarate si definite. Numele unei variabile globale
incepe cu @@. Nu este permisa definirea de variabile locale cu acelasi nume cu al
variabilelor sistem intrucat nu se garanteaza predictibilitatea rezultatelor.
Exemplu:
Print @@ version
Declare @ mess1 char(21)
Select @ mess1=server name is+@@servername
Print @mess1

Instructiunea print
Instructiunea PRINT permite transmiterea si afisarea de informatie pe dispozitivul de
iesire definit. Ea poate sa afiseze direct doar valori de tip CHAR, nCHAR, VARCHAR
sau nVARCHAR ori variabila globala @@VERSION. Orice alte valori trebuie sa fie
convertite la un sir de caractere cu lungimea maxima 8000 octeti pentru a putea fi afisat.

Sintaxa:
PRINT 'msg_str' | @local_variable | string_expr | @@global_variable

Pentru afisare se pot utiliza siruri formate prin concatenarea altor siruri, variabile locale
sau globale, functii CONVERT sau CAST.

Instruciuni de atribuire
Instruciunea SET atribuie valori unei variabile in T-SQL.
Sintaxa generala a instruciunii este:
SET nume variabila = expresie;

Expresia din partea dreapta poate fi un literal, un cuvant cheie sau o expresie incluzand o
instruciune SQL.

Exemple:
SET @v_nume=NULL;
SET @v_cod=3;
SET @v_nota=@v_nota*0.9;
SET
@v_nota=(SELECT
nota
CODMATERIE=12);

FROM

NOTE

WHERE

CODSTUDENT=1111

In cazul ultimei instruciuni de atribuire, se va obtine o eroare


mai mult de o linie va fi returnata de instruciunea SELECT.

SQLERROR,

AND

in cazul in care

Instruciuni de control
Instruciunile de control din T-SQL sunt similare cu instruciunile de acelasi tip folosite
de limbajele de programare convenionale, cum ar fi C++ sau Java. Aceste instruciuni
sunt: IF..ELSE, WHILE, BREAK, CONTINUE, CASE, GOTO, RETURN,
TRY..CATCH, WAITFOR.

1. Instruciunea IF..ELSE
Instruciunea IF este o instruciune de decizie sau de selecie.
Sintaxa generala a instruciunii este:

IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]

Argumentele:
boolean_expression este o expresie care dupa evaluare returneaza True sau False.
Daca expresia booleana contine o instructiune SELECT, acesta trebuie inclusa
intre paranteze.
{ sql_statement | statement_block } reprezinta orice instructiune Transact-SQL
sau o multime de instructiuni
Dupa cum se poate observa din sintaxa generala, instruciunea
instruciune de selecie cu doua ramuri.

IF

in T-SQL este o

Instruciunile de pe orice ramura a structurii IF, pot fi inlocuite cu blocuri de instruciuni


cuprinse intre BEGIN si END.

2. Instruciunea WHILE
Instruciunea WHILE este o instruciune care permite repetarea unui grup de instruciuni
atata timp cat condiia specificata dupa WHILE este adevarata. Mai intai este testata
condiia, iar in caz ca ea este indeplinita se executa corpul ciclului.
Observatie:
este un ciclu cu test anterior, adica este posibil ca, corpul ciclului sa nu se
execute niciodata.
WHILE

Sintaxa generala:
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
{ sql_statement | statement_block }

Instructiunea, comanda SQL sau blocul care urmeaza dupa cuvantul cheie WHILE va fi
executata atata timp cat expresia de test va avea valoarea TRUE.
Este foarte important ca in urma execuiei ciclului WHILE sa apara o situaie care sa
determine modificarea condiiei testate, in caz contrar aparand o ciclare infinita.

Exemplu: O portiune dintr-o procedura stocata mai complexa, pentru a evidentia folosirea
lui WHILE.
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300
BEGIN
UPDATE Production.Product
SET ListPrice = ListPrice * 2
SELECT MAX(ListPrice) FROM Production.Product
IF (SELECT MAX(ListPrice) FROM Production.Product) > $500
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear';

3. Instruciunea BREAK
BREAK se utilizeaza in cadrul unui bloc pentru a intrerupe executia blocului. Executia
va continua cu prima instructiune care urmeaza dupa blocul a carui executie a fost
intrerupta.

4. Instruciunea CONTINUE
CONTINUE se utilizeaza in instructiunea conditionala WHILE pentru a forta reluarea
executiei blocului atata timp cat conditia de test are valoarea TRUE. Eventualele
instructiuni din bloc care urmeaza dupa CONTINUE nu vor mai fi executate.
1.

Pentru informatii detaliate se poate studia Books online.

5. Functia CASE
Functia CASE permite utilizarea unei variabile ca argument si testarea valorii acestei
variabile pentru mai multe cazuri specificate explicit. Ca si instruciunea IF, functia CASE
poate utiliza o clauza ELSE pentru specificarea instruciunii care va fi executata daca
valoarea variabilei nu se gaseste in mulimea valorilor specificate explicit. Instruciunea
CASE este preferabila instruciunii IF atunci cand implica un arbore multicai de decizie in
care intrarea pe orice ramura este determinata de valoarea unei aceleiasi expresii.
Functia

CASE evalueaza o lista


expresii rezultat posibile.

de

conditii

si

intoarce

una

sau

mai

multe

CASE are doua formate:

Functia CASE simpla compara o expresie cu o multime de expresii simple pentru


a determina rezultatul

Functia CASE de cautare evalueaza o multime de expresii boolene pentru a


determina rezultatul.
Ambele formate suporta un argument ELSE optional.

Functia CASE simpla (Simple CASE function):


CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

Functia CASE de cautare (Searched CASE function):


CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

Argumentele:
input_expression este o expresie evaluata cand este folosit formatul CASE
simplu. input_expression este orice expresie valida.
WHEN when_expression
este o expresie simpla la care se compara
input_expression pentru un format CASE simplu. when_expression este orice
expresie valida. Tipurile de date pentru input_expression si pentru
when_expression trebuie sa fie identice sau sa poata fi convertite implicit.
n este o valoare care indica cate
WHEN when_expression THEN
result_expression pot fi folosite sau cite WHEN Boolean_expression THEN
result_expression pot fi folosite.
THEN result_expression este o expresie returnata cand egalitatea intre
input_expression si when_expression este evaluata la TRUE sau daca
Boolean_expression este evaluata TRUE. result_expression este orice expresie
valida.
ELSE else_result_expression este expresia returnata daca nici o operatie de
comparatie nu este TRUE. Daca acest argument lipseste sau nici o comparatie nu
este evaluata TRUE, CASE va returna valoarea NULL. else_result_expression
este orice expresie valida. Tipurile de date ale else_result_expression si
result_expression trebuie sa fie identice.
WHEN Boolean_expression este o expresie booleana care este evaluata atunci
cand se foloseste formatul CASE cautat. Boolean_expression este orice expresie

booleana valida.

6. Instruciunea GOTO
Aceasta instructiune permite saltul neconditionat la instructiunea, comanda sau blocul ce
urmeaza dupa eticheta specificata. Instructiunile GOTO si etichetele pot fi utilizate
oriunde intr-o procedura, batch sau declaratie de bloc. Instructiunile GOTO pot fi
imbricate.
Sintaxa:
Define the label:
label : Alter the execution:
GOTO label

Argumente:
label este punctul dupa care incepe procesarea, daca GOTO specifica aceasta
eticheta. Etichetele trebuie sa respecte normele de identificare. Daca este folosita
GOTO, o eticheta poate fi folosita ca o metoda de comentare.

7. Instruciunea RETURN
Instructiunea RETURN este folosita pentru a iesi neconditionat dintr-o interogare sau o
procedura. Instructiunea RETURN este imediata si completa, ea poate fi folosita la orice
moment pentru a iesi dintr-o procedura , batch sau instructiune bloc. Declaratiile care
urmeaza dupa RETURN nu sunt executate.
Sintaxa:
RETURN [ integer_expression ]

Argumentul:
integer_expression este o valoare intreaga care va fi returnata. Procedurile stocate
pot intoarce o valoare intreaga la apelul unei proceduri sau a unei aplicatii.

8. Instruciunea TRY..CATCH
Instructiunea TRY..CATCH implemneteaza tratarea erorilor pentru Transact-SQL care
este similara cu cea din limbajele C# si C++. Un grup de declaratii Transact-SQL pot fi
incluse intr-un bloc TRY. Daca apare o eroare in cadrul blocului TRY, controlul este
trecut la un alt grup de instructiuni din cadrul blocului CATCH.
Sintaxa:
BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH

{ sql_statement | statement_block }
END CATCH
[ ; ]

Argumente:
sql_statement reprezinta orice declaratie Transact-SQL.
statement_block reprezinta orice grup de declaratii Transact-SQL dintr-un batch
sau din cadrul unui bloc BEGINEND.

9. Instruciunea WAITFOR
Intructiunea WAITFOR blocheaza executia unui batch, a unei proceduri stocate sau a
unei tranzactii pina la un moment de timp specificat, dupa expirarea unui interval de
timp, sau pina ce se modifica o declaratie specificata sau se intoarce cel putin un rind.
Sintaxa:
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| ( receive_statement ) [ , TIMEOUT timeout ]
}

Argumentele:
DELAY este specificata o perioada de timp, de asteptare de pina la maxim 24 de
ore, inaintea executiei unui batch, a unei proceduri stocate sau a momentului la
care o tranzactie poate incepe.
'time_to_pass' este perioada de timp de asteptare. Acest argument poate fi
specificat intr-un format de date de tip datetime acceptat, sau poate fi specificat
intr-o variabila locala.
TIME este momentul specificat pentru rularea unui batch, a unei proceduri stocate
sau a unei tranzactii.
'time_to_execute'
este momentul in care se finalizeaza instructiunea
WAITFOR.Acest argument poate fi specificat in format de data acceptat sau intr-o
variabila locala.
receive_statement este o instructiune valida RECEIVE.
TIMEOUT timeout specifica timpul, in milisecunde pentru asteptarea sosirii intr-o
coada a unui mesaj.

13. Probleme propuse si rezolvate


Pentru toate cerintele se va folosi structura bazei de date din cadrul laboratorului.

Exemplu 1. Procedura stocata pentru obtinerea tuturor departamentelor si a informatiilor


despre ele.
create procedure obtineredep as
begin
select * from departamente
end

Pentru testarea procedurii se deschide o noua fereastra de query sau din aplicatia client, si
se scrie:
exec obtineredep

Exemplu 2.. Procedura stocata pentru obtinerea informatiilor despre un anumit


department, dat ca parametru de intrare
create procedure obtinerenumedep (@iddep int) as
begin
select * from department where departamentid=@iddep
end

Pentru testarea procedurii se deschide o noua fereastra de querysau din aplicatia client, si
se scrie:
exec obtinerenumedep 1

Exemplu 3. Procedura stocata cu 2 parametrii de intrare. Daca o variabila, numita


@param este diferita de 0, sa se afiseze toti angajatii care lucreaza la un anumit proiect,
cu idul dat ca parametru de intrare, si daca acea variabila este egala cu 0, sa se afiseze toti
angajatii care nu lucreaza la un anumit proiect, cu idul dat ca parametru de intrare.
create procedure obtangpeproiect (@param int, @idproiect int) as
begin
if (@param<>0)
select cnp, a. nume
from angajati a, angajatiproiecte ap
where a.angajatid=ap.angajatid and proiectid=@idproiect
else
select cnp, a. nume
from angajati a, angajatiproiecte ap
where a.angajatid=ap.angajatid and proiectid<>@idproiect
end
end

Pentru testarea procedurii se deschide o noua fereastra de query:


exec obtangpeproiect 1,5

Exemplu 4. Procedura stocata cu parametru de iesire, @maxim in urma rularii ei sa se

afiseze cel mai mare id din tabela proiecte.


create procedure obtmaxidproiect (@maxim int output) as
begin
select @maxim=max(proiectid) from proiecte
return @maxim
end

Pentru testarea procedurii se deschide o noua fereastra de query:


declare @x int
exec @x= obtmaxidproiect 1
print @x

Exercitii:
1. Creati o procedura stocata care sa aiba la iesire toate informatiile depre proiectele stocate
in baza de date
2. Creati o procedura stocata pentru a obtine informatiile despre un proiect cu numele
proiectului sa fie parametru de intrare.
3. Creati o procedura stocata care sa intoarca intr0un parametru, cel mai mic salariilor din
companie.
4. Creati o procedura stocata care sa intoarca media salariilor pe fiecare departament (un
parametru de intrare si unul de iesire).

S-ar putea să vă placă și

  • Cap 6
    Cap 6
    Document33 pagini
    Cap 6
    Mihai
    Încă nu există evaluări
  • Control
    Control
    Document7 pagini
    Control
    Mihai
    Încă nu există evaluări
  • Ec Stare
    Ec Stare
    Document18 pagini
    Ec Stare
    Mihai
    Încă nu există evaluări
  • 0 - Suport
    0 - Suport
    Document5 pagini
    0 - Suport
    Mihai
    Încă nu există evaluări
  • 2.3.minimizarea Unui Automat Finit
    2.3.minimizarea Unui Automat Finit
    Document8 pagini
    2.3.minimizarea Unui Automat Finit
    Alex Burlacu
    Încă nu există evaluări
  • Merge PDF
    Merge PDF
    Document205 pagini
    Merge PDF
    Mihai
    Încă nu există evaluări
  • Tema 3
    Tema 3
    Document1 pagină
    Tema 3
    Mihai
    Încă nu există evaluări
  • Examen BD1
    Examen BD1
    Document2 pagini
    Examen BD1
    Vallentyna Bojan
    Încă nu există evaluări
  • Rezolvare
    Rezolvare
    Document5 pagini
    Rezolvare
    Mihai
    Încă nu există evaluări
  • Orar 3 AC
    Orar 3 AC
    Document1 pagină
    Orar 3 AC
    Mihai
    Încă nu există evaluări
  • Colocviu
    Colocviu
    Document2 pagini
    Colocviu
    Mihai
    Încă nu există evaluări