Sunteți pe pagina 1din 8

PROCEDURI STOCATE

O procedur stocat este o mulime ordonat de instruciuni SQL stocat permanent pe server i compilat la utilizare. Procedurile stocate reprezint o modalitate de a crea rutine i proceduri care s fie rulate pe server de ctre procesele serverului. Aceste proceduri pot fi lansate n execuie de o aplicaie apelant sau de declanatoare sau de regulile de integritate. Deoarece SQL-server permite administrarea bazelor de date din sistem este logic ca serverul este locul cel mai bun pentru rularea procedurii stocate. Procedurile stocate pot s returneze valori i s modifice, s execute operaii de comparare cu valorile precomparate folosite de sistem. Procedurile stocate pot s primeasc i s returneze valori care nu provin neaparat dintr-o tabel ci sunt calculate prin execuia procedurii. Procedurile stocate ruleaz pe servere care sunt calculatoare puternice. Avantaje: 1. Procedurile stocate ruleaz pe servere care sunt calculatoare puternice; 2. Deoarece ele sunt stocate pe server nu mai necesit transfer de informaii din baza de date, ele fiind pe acelai calculator; 3. Procedura beneficiaz de un acces direct, rapid i imediat la baza de date ce permite o prelucrare rapid a informaiilor; 4. Permite partajarea logicii aplicaiei ntre aplicaii diferite; 5. Simplific integrrile parametrizate facilitnd rularea repetat aceleiai interogri cu seturi diferite; 6. Ofer faciliti pentru dezvoltarea C/S prin modularizarea aplicaei separnd modulele pentru client i server, ce permite scurtarea timpului de execuie i uurarea gestiunii aplicaei; 7. Componentele de pe server pot fi dezvoltate separat de componentele client fapt ce face posibil refolosirea lor ntre aplicaile client; 8. Ele pot furniza mecanisme de securitate: gestiunea vederilor i a procedurilor stocate pot fi folosite ca instrumente de asigurare a securittii . Pot fi create

proceduri stocate pentru operatiile de adugare/ modificare/ tergere/ citire controlnd programat fiecare din aceste tipuri de acces la informaii; 9. Impune pe partea de server reguli orientate spre date, permit impunerea de reguli i relaii logice care sporesc controlul informaiilor n sistem; 10 .Micoreaz transferul de instruciuni T-SQL. La utilizarea procedurilor stocate exist 4 etape principale: a) Etapa de creare n care se creaz procedura cu ajutorul comenzii: CREATE PROCEDURE. b) Executia de ctre utilizator-se execut cu ajutorul comenzii: EXECUTE. c) Etapa de COMPILARE n care serverul compileaz i d) Etapa de executare de catre server n care compilat al procedurii n timpul unei comenzi EXEC. optimizeaz procedura.

serverul ruleaz planul de execuie

Crearea unei proceduri stocate se face cu ajutorul comenzii:

CREATE PROCEDURE [posesor] nume_procedura:nr @nume_parametru tip_data [=default][output] @nume_parametru tip_data [=default][output] . [FOR REPLICATION][WITH Recompile] ENCRIPTION] AS .. INSTRUCIUNI SQL RETURN

Nume_procedur reprezinta numele noii proceduri stocate. Numele procedurii trebuie s fie unic n cadrul unei baze de date. Procedurile temporare globale sau locale sunt create prin adugarea ca prefix la nume_procedur a unui caracter # (#nume_procedur) pentru proceduri temporare locale i dou caractere ## (##nume_procedur) pentru proceduri temporare globale. Numele complet al procedurii incluznd i # sau ## nu poate depasi 128 caractere.

Observatie: dup ce n baza de date sunt nscrise informaii multe cu care aplicaia lucreaz trebuie ncrcat din nou procedura stocat. nr este un ntreg optional folosit pentru a grupa procedurile cu acelai nume astfel ele pot i eliminate mpreun printr-o singur instruciune DROP PROCEDURE. De exemplu, ntr-o aplicaie procedurile folosite se numesc orderproc;1, orderproc;2, etc. Prin folosirea instructiunii DROP PROCEDURE orderproc se elimin ntregul grup de proceduri. Numele i alte informaii sunt nregistrate n tabelul sysobjects, iar codul surs este stocat n syscomments. Execuia unei proceduri se face prin execuia unei instruciuni: EXECUTE nume_procedura O procedur nu poate fi creat decat n baza de date curent. Pentru c baza de date s fie curent n care dorim s creem o procedur trebuie ca instruciunea de creare s fie precedat de USE-nume_baz. Procedurile pot conine orice comenzi mai puin comanda de creare. La crearea unei proceduri stocate SQL se compileaz i se verific operaiile pe care le efectueaz. Dac sunt erori procedura este respins. Ea poate fi acceptat chiar dac apeleaz o alt procedura stocat care nu a fost implementat, dar se va primi un mesaj de avertizare. Dac nu se mai creaz o procedur stocat apelat utilizatorul va primi un mesaj de eroare. Exemplul 1: CREATE PROCEDURE determin_salariai as SELECT * FROM salariai

EXEC determin_salariai. Dac apelul procedurii este primul dintr-o secven de comenzi nu este nevoie s mai specificm EXECUTE din partea de instruciuni. E ste suficient numai numele procedurii. Numele procedurii nu poate s conin spaii i poate fi accesat prin

BAZA_DEDATE.<OBJECT>

Transmiterea de parametrii Programatorul poate s transmit valori care pot s intervin n execuia

procedurii care respect urmtoarele principii: - o procedur poate avea o mulime nevid de parametrii; - parametrii pot fi utilizai ca locaii nominale; - desemnarea parametrilor se realizeaz prin prefixarea numelor cu simbolul @; - parametrii sunt locali pentru procedura n care sunt definii. Parametrii sunt folosii pentru a transmite informaii unei proceduri la apelul ei care se introduc dup numele ei separai prin virgule i urmai de tipul informaiilor ateptate(acelai cu tipurile de date ale SQLS).
Valoarea fiecrui parametru trebuie s fie nlocuit de ctre utilizator atunci cnd procedura este executat. O procedur stocat poate avea maxim 2100 parametrii

In exemplul 2 dm o procedur de inserare.

CREATE PROCEDURE inserare @n char(15), @p char(15), @v int , as INSERT INTO stud VALUES(@n,@p,@v) Inserare(Albu,Ion,20) Dac numele proceduri este urmat de un punct i virgul i un numr ntreg acesta specific versiunea de creare a procedurii, implicit se nelege 1. Comanda SET NO EXEC ON determin eventualele erori la prima execuie a unei proceduri. Aceasta permite evitarea eventualelor erori. Stergerea unei proceduri se face prin
DROP PROCEDURE nume-procedur.

Exemple de proceduri. Crearea procedurii de afiare a mediilor studenilor unei grupe.


IF EXISTS (SELECT name FROM sysobjects WHERE name = 'medii' AND type DROP PROCEDURE medii

= 'P')

CREATE PROCEDURE medii @Gr INT, AS SELECT S.NrLeg, Nume, Prenume, Avg(C.Nota) FROM Student S, Catalog C WHERE S.NrLeg=C.NrLeg AND Gupa=@Gr GROUP BY S.NrLeg, Nume, Prenume EXEC medii 221

Media

Procedura calcleaz media unui student al crui nume e dat ca parametru


IF EXISTS (SELECT name FROM sysobjects WHERE name =' medie_stud ' AND type = DROP PROCEDURE medie_stud CREATE PROCEDURE medie_stud

'P')

@nume varchar(40), @Medie float OUTPUT


AS SELECT S.NrLeg, Nume, Prenume, Avg(C.Nota) FROM Student S, Catalog C WHERE S.NrLeg=C.NrLeg and Nume=@nume GROUP BY S.NrLeg, Nume, Prenume EXEC

Medie

medie_stud ' Ionescu'

Procedura calcleaz numrul de examene la care s-a prezentat un student al crui nume e dat ca parametru.
CREATE PROCEDURE sit_stud_

@nume varchar(40)='L%'
AS SELECT S.NrLeg, Nume, Prenume, COUNT(C.Nota) FROM Student S, Catalog C WHERE S.NrLeg=C.NrLeg and Nume like @nume GROUP BY S.NrLeg, Nume, Prenume EXEC sit_stud_

Nr_examene

EXEC sit_stud 'G%'

Execuia de ctre utilizator Prima dat cnd se execut o procedur nou ea este citit din tabelul syscomments i se rezolv referirile ei la alte obiecte.In timpul acestui proces, procesorul de comenzi construiete arborele de secven sau interogare care este apoi transferat optimizatorului de interogare i compilare.

Compilarea Dup ce s-a reuit crearea arborelui de interogare optimizatorul SQL Server compileaz ntreg pachetul i l optimizeaz i verific drepturile de acces. n timpul fazei de optimizare,optimizatorul transform arborele de interogare ntr-o structur optimal innd cont de planul de accesare a datelor vizate de procedur. n timpul acestei etape se ine cont de: - utilizarea unirilor pentru legarea tabelelor; - cantitatea de date; - condiiile de grupare; - gradul de distribuire al datelor; - utilizarea comparaiilor n clauzele WHERE i HAWING. Planul de execuie al procedurii va fi plasat n memoria cache rezervat procedurii dup ce optimizatorul l-a terminat de construit i este compus din: - pai de realizare a procedurii stocate, - paii ce descriu impunerea restriciilor; - paii de declanare lansai de procedura stocat.

Executarea de ctre server Faza de execuie este cea n care se prelucreaz secvenial planul de execuie , fiecare pas este trimis la procesorul corespunztor de gestiune (DDL, DML, gestionarul de tranzacie, gestionarul de prelucrare a procedurilor automate, OLE ca managerul de proceduri stocate, managerul TSQL etc), care sunt apelai repetat n procesul de

prelucrare. Planurile de execuie nu sunt niciodat stocate pe disc. ntr-o procedur stocat partea stocat permanent este codul surs. La repornirea serverului sunt eliminate toate planurile de execuie curente i SQL-server reface automat planul de execuie al unei proceduri cnd: - mediul de execuie al proceduri difer semnificativ de mediul sau de creare - cnd se modific schema-ver din tabelul sysobjects pentru cel puin un obiect. Coloanele SCHEMA-VER i BASE-SCHEMA-VER sunt actualizate de fiecare data cnd se schimb informaiile din baza de date. sau modificat statisticile pentru obiectele referite de procedur i n memoria chache nu este disponibil o copie. Putem fora recompilrile planului de execuie cu opiunea WITH RECOMPILE. Afiarea i editarea procedurilor

Procedura de sistem SP-HELPTEXT de afiare a procedurii se face prin intermediul administratorului de sistem SQL. Efectuarea unei dublu clic pe procedura dorit din fereastra de administrare a serverului permite ca procedura s fie operat i modificat n fereastra STORED PROCEDURE PROPERTIE poate fi

Exemplu de procedur cu parametri returnabili


IF EXISTS (SELECT name FROM sysobjects WHERE name = 'medie_stud' AND type = DROP PROCEDURE medie_stud

'P')

CREATE PROCEDURE medie_stud

@@numest varchar(40) = '%', @@medie float OUTPUT


AS SELECT Nume FROM Student WHERE Nume LIKE @@numest SELECT @@medie=Avg(C.Nota) FROM Student S, Catalog C WHERE S.NrLeg=C.NrLeg and Nume like @@numest

DECLARE @@med float EXECUTE medie_stud '%', SELECT @@med PRINT @@med

@@med OUTPUT

--pentru afiare mod text

DECLARE @@med float EXECUTE medie_stud 'Ionescu', SELECT @@med

@@med OUTPUT

DECLARE @@med float EXECUTE medie_stud 'I%', @@med OUTPUT IF @@med < 8 BEGIN PRINT ' ' PRINT 'Media mai mic ca 8' END ELSE BEGIN PRINT ' ' PRINT 'Media mai mare ca 8' SELECT 'Aceasta este ' + RTRIM(CAST(@@med END

AS varchar(20)))

Exercitii Scriei procedura care calculeaz media unei grupe date pentru studenii integraliti. Scriei procedura de determinare a studenilor bursieri.