Sunteți pe pagina 1din 103
iblioteca UTCN iotec ii ie OSG 2002 Ss 8 Ss UNIV. TEFINICA CLUPN. BIBLIOTECA | Nr. 908.668. | 1003 SSS MULT) SOL Sawa aL 2 Beppe Ree CUPRINS PREFATA TIPURI DE DATE $I VARIABILE... Tipuri de date in SQL Server... Variabite. i Declararea unei variable Atvibuirea de valori unei variabile Exerciti si probleme.. Funetii SQL. Fonetii scalare.... Funcfii matematice. os rina + Funct care opereaza asupragirurilor de caractore Funeti pentru manipularea valorilor de tip data calendatistion Funetii sistem (conversii... i hy Exerciti $i probleme... TABELE $I INDECG).. Instructiunea CREATE TABLE, eee Definirea unei coloane.. Director ecitura 12, MANE a : ‘Smaranda Dervesteanu dtofy, 1.2.1, opines carneclor nil decid, e ~ Exprimarea constréngerilor la nivel de tabela..2. eualie Abasine: intrines ALE a Instrucfiunea DROP TABLE... cones Urilizatea instructiunilor CREATE TABLE $i Lilt Dervesteanu ALTER TABLE... ee aa Indecsi.... eee EBITURA ALBASTRA |. Instruetiunea CREATE INDEX. comanda 117 /2002 Instruetisnea DROP INDEX... Exerciti si probleme. Codiuta Poenaru Toot dept asupra acess! ei sunt rezewvate 0, Casa de Edtura Albastra er wz ORDER BY eli de agregare... xerciti gi probleme IULAREA INTEROGARILOR 'LIMBAJUL SQL (PARTEA |). ierogari simple. plarea a mai multe reli ‘Folosires operacoruli i Folosires operatorului Exerciti i probleme FORMULAREA INTEROGARILOR IN LIMBAJUL SQL (PARTEA A I-A)... Fotosi cine lor GROUP BY si HAVING, . i problem 123, 124, 125 126, VALORI NULL $1 OPERATII DE CUPLARE EXTERNA.. Valori Null 120 Funefia ISNULL .... 122 Operatii de cuplare extemil- inerogi 125 Exercii gi probleme 131 FUNCTHI CASE, OPERATII DE INSERARE, STERGERE $I ACTUALIZARE 132 Funetii (expresil) CASE... 132 Operatii de inserare, stergere gi actualizare... 135 Instructiunea INSER’ : 135 Instructiunea DELETE, 137 Instructiunes UPDATE. 139 Exerciii gi probleme 1483 VEDERI. SQL DINAMIC .. 145 Vederi. M45 Instrucfiunea CREATE VIEW. 146 Instructiunea ALTER VIEW, 149 Instructiunea DROP VIEW. 149 Modificarea datelor din vederi 150 SQL dinamic nun 153 Exerciii si probleme 159 PROCEDURI STOCATE. 161 Instruetiunea CREATE PROCEDURE. 162 Instructiunea EXECUTE vn 165 Instructiunea ALTER PROCEDURE 167 Instructiunea DROP PROCEDURE. 167 Exemple de utilizare a procedurilor stocate.. 168 Exerctii si probleme, 12 CURSOARE SQL SERVER. Instrucfiunes DECLARE CURSOR... Jnstructiunea OPEN Anstructiunes FETCH Variabila sistem @ @FETCH_STATUS Instructiunea CLOSE ‘ Instructiunea DEALLOCATE .. o utilizare a cursoarelor, Wi 91 probleme... iunea CREATE TRIGGER Instructiunea DROP TRIGGER. Proprictat ale tigzerelor.. ‘Triggere multipte g " Teiggere recursive. Triggers imbricate. Exemple de'wilizare a wiggersion Exerciti si probleme .. BIBLIOGRAFIE ie cod care $f executat de citre SQL Server, dar poate fi uilé si administratorilor de bave date, implicati in proiectarea si configurarea bazei de date, sau utilizar simpli care pot exploata o bazi de date formulind direct interogiri SQL. Ca cunostinge preliminare necesare, din partea cititorului, se presuptin curose lementele fundamentale ale teoriei bazelor de date rationale Volumul acoperd versiunile SQL Server 7.0 si SQL Server 2 i clementele care difert de Ia 0 versiune la celal, 20 Unde este eazul : Un accent deosebit este pus pe limbajul de interogare SQL, prezentaten ftazei SELECT si formularea de interogiri de la cele mai simple pant iy iMeropiri complexe. Aceasté parte a lucrtii poate fi studiats ca alare independent de sistemal SQL Server, accentul find pus pe sintaxa standand SQL'92, le care SQL Server se alininzi. Acolo unde apar deoscbir) ale Silaxci SQL. Server fati de standardul SQU'92 ele. sunt. menjonate 91 comentate, find oferite mai multe variante de rezolvare a interogirlo, nthe care cel putin una este suportaté de cttre SQL, Server. Pe lanai limbajul de interogare, mai sunt prezentate o serie de elemente $i concepte care sunt in mai mare masurd legate de sistemul SQL Seren AxtGl sunt prezentateelementele de bazd ale dalectului TSQL (vaianta SOL Benty sistemele SQL. Server) cum a fi tipuride date, vaiabil,introctiu de contol, operator, funefit, precum si concepte si instnumente de lucry rat Gralhate cum sunt: vederi, proceduri stocate, trigger, cursoare, SQL diname sialtele Fiecare capitol abordeazd cfte 0 tematic relativ independent, ori cdte GoUk subiecte corelete, usta print-an numér mare d= exemple repre: Zentative si insotite de un set de exercii si probleme propuse spre reralvane Cartea este organizatt in 13 capitole atl Capitola 1. ‘Tipuri de date si variable ~ preznt, tn prima pate, tipurile de gate din SQL Server, proprietitile acestoa si precedenta tipuilor de ate, Parten’a doun se refers Ja varabile: declararea de variable 91 inifializarea acestora prin intructiunile SPT sau SELECT. Capitolul 2. Operators fumefii—trece in revistt categorie de operatori din SQL Server: aritmetici, de atribuire, pe biti, de comparsre, logic, de Garcatenare siruri de caractere, operatori x unari, Su tetalare a expresilor complexe yi recedeata op Incepitori ar putca amana studiul E Capitotut St unitate independenta de compitare si comanda GO. Capitolul S. Sintaxa trazei SELECT in SOL Server _ SELECT si functile de agregare, Carita 6. Formularea interogtrlor tn tinbajal SQL (arten 1) ial singh formulre a interogtctor ta SQM cepted ny aie Henne eta etituand co exemple complexe, iaclnty nae Coe HlusteazA modu de flosie al operatorilor IN $i EXIST " Capitolul 7. Formularea interogirilor fa limbajut SQL (Partea a Dea) — cane exemple care itustreaza modal de folosre (eae evitare!) clauzelor GROUP BY si HAVING. Capitolul 8. Valori NULL: si operatii de cupl prezin i operafii de cuplare externy — create valorilor NULL gi exemple referitoare operaile de cuplare externa: FULL JOIN, RIGHT JOIN, LEFT JOIN, Capitola 8. Funct CASE. Operafi de inscrare, tergere si aetualizare, — Przinit fanctile CASE si exemple de utlizare's acest ee instructiunile INSERT, DELETE si UPDATE. eet rezintd sintaxa frazei Capitolul 10. Vederi. SQL dinamic. ~ abordeaes, in prima part, eonceptul de vedere: crearea/modificaea vederilor, utlizarea tn interogiti Particularitati refreritoare la modificarea datelor din vederi. Partea a doua arati cum se poate executa, prin intrucjiunea EXECUTE sau Procedura sp_executesql, © secventi de instructiuni SQL care este onstruii ca un sir de earacter, in mod dinamic, la momentul exceutie. Capitolul 11, Proceduri stocate — introduce conceptul de procedusa stocati Problemele legate de aceasta: creare/modificare, executie, transmiterca aramerrilor, exemple de proceduri. Capitolul 12. Cursoare SQL Server — desi tn SQL Server este incurajatt solutionarea problemelor prin folositea pe At posibil a frazelor SQL, Sunt situaif cdnd este nevoie si se recurgA la mijloace navigationale, Acestea sunt reprezentate in SQL Server prin conceptnl de cursor. Prin cursoare se poate realiza accesul la date, tupli cu tuplA, si realiza o prelucrare individualizaté a fiecdrei tuple. Sunt prezentate si exempli. ficate etapele unei prelucrari pe baz de cursor: declararea gi deschiderea ursorului, tnetircarea datelor tn cursor, prelucrarea propriu-zish, Inchideres si dealocaren cursorului Capitotul 13. Teiggere — alimul capitol este dedicat une categorit speciale de proceduri stocate si anome tiggerelor, Principalauilzare a Wiggereler cste pent a impune asupra unei baze de date 0 serie de cortetnger Pentru care sistemul nu ofera posibiltti declarative de exprimare. Dey Se bazeaz8 pe pricipit generale: comune, implementares tiggereler diferdsensibi de la un sistem ta altul, In aces eaptol este resovtoe modul de lucru eu triggere in SQL Server 7.0 312000. Sunt presenta triggerele de tip INSTEAD OF care au aptrut odath eu versivnea SOL, Server 2000, {in incheiere doresc si aduc multumiri tturor celor care prin comentarii si idei si-au adus contributia la tmbundtitirea materialului prezentat fn aceasta «arte, Pe de alté parte, pornind de la convingerea cf este fatotdeauna loc pentru mai bine, asteptém observatiile si sugestile cititorului intecesat Ia adresa e-mail robert. dollinger@es,utcluj.ro August 2001 Dollinger Robert 4. TIPURI DE DATE $I VARIABILE 1.1. Tipuri de date in SQL Server Otice obiect din SQL Server care confine o dati (atribut, variabila, ‘expresie, parametru de procedura, func{ie ori procedural stocata care returneaz fo valoare) are asociat un tip de data prin care se defineste ce fel de valori poate ‘toa obiectul. Specificarea unui tip de data presupune definirea a mai multe ‘caracteristici ale obiectulu natura datelor continute de obiect (caracter, intreg, binar etc); — dimensiunea valorilor stocate (Ia esent numirul de octeti mecesari pentru stocare);, = precizia (numai pentru valori numerice, indick numérul total de cifre 2ecimale care pot fl acceptate pentru wn tip de data); — scala (numai pentru valori numerice, numarul de zecimale acceptate fntr-o anumitd reprezentate). SQL Server oferi un set de ripuri de date de bazd care defineste tipurile e valori acceptate de acest sistem. Pe langt acestea existi posibilitatea defiiri de tipuri de date utilicator. Un tip utiizator este intotdeauna definit in termenii ‘unui tip de baz caruia fi adaugl unele caracteristici suplimentare menite a descrie mai bine o anumité clasi de valori (de ex. inteegi pozitivi). La definirea unui tip de data utilizator se specified numele tipului de data creat, tipul de baza din care provine, daci accept’ sau ou valori NULL si constringerile suplimentare pe cate Ie satisfac valorle tipului utilizator. Tipurile de date de baza existente in SQL Server sunt: TIPURI NUMERICE EXAC Defines tipuri numerice intregi de diferite dimensiuni. Acestea sunt: bigint _- intregi reprezentafi pe 8 octet, interval de valor: - 2963 Ia 2462-1 int ~ intregi reprezentatf pe 4 octet, interval de valor: - 2931 1a 231-1 u tinyine - Tipul bit are 0 rey il ZECIMALI ia Gi scala fixe. numeric((p|, 5 (scala) smallint prezentare optimizatd tro tbe existi pind la 8 atribut nese tipuri numerice + ee! cprezontaipe 2 oct interval de valor mista ~ intregi pozitivi reprezentati pe un octet, interval de valori: 0 la 255, sa e in cadrul bazei de date, astfel te de tip bit ele sunt impachetate daca sunt fntre 9 si 16 atibue stn el comet's Sam, Dac& atributele accept $i vs i loci NULL, atone! sprit Pentru stocare este mai mare, a E Pentru reprezentarea valorilor zecimale avind ‘ecitmal{o, 3) - interval de valor -10°38 +1 la 10938 - 1, $I)1- echivalent funetional cu tipul decimal > (preizi) este 0 valoae fare 1 5138; specifica numarul ‘maxim de cifre zecimale pe care le poate avea umérul atat la stinga cat gi dreapta punctului zecimal * Specific mumtrul de zocimale. Este 0 valoare GUPrinsa thre 0 si valoarea lui p. Implicit este oO Exemple de constante zecimale: 123.43, 5.6, 7.32 Observatie: Namirul de oct flositi pentru eprezentarea uneivalori decimal sou nniumeric depinde de pre recizia acestuia (de ex. pentru p>28 poate ajunge Ia 17 octet), TIPUR! MONETARE Definese tipuri de date pentru reprezentarea valor de bani int-0 moneds specificatl. money lor ce reprezinta sume * teprezentare pe 8 octei, interval de valoti: -2463 Ia 2463 - 1, cu acuratefe de 4 zecimale din unita- tea monetard de baza, ‘smallmoney - reprezentare pe 4 octeli, interval de valori: 2°31 Ja 2931 - 1, eu acurateje de 4 zecimale din unita- tea monetara de baza, Exemple de constante de tip monetar: $100.00, 200 TIPURI NUMERICE APROXIMATIVE Definese tipuri numerice cu reprezentare in virguld mobil float [(m)] - este un num flotant a L79E 4-308. intervatul - 1.798 + 308 Parametrul neste un fntreg de la 1 la $3 reprezentind numérul de biti folositi pentra reprezentarca mantisei si este determinant pentru precizia si dimensiunea reprezentirii numArulul flotent, dupa cum se arata fn tabelul de mai jos: 3 ~ este un mum flotant fn intervalul ~3.408 + 38 la 3.408 + 38; reprezentarea este pe 4 octeti, este sinonim cu float(24) si corespunde reprezentiri fotantc in simpla precizie. Exemple de constante de tip flotant: 1023.12, 1008-1 6.__TIPURI DATA CALENDARISTICA Definese tipuri destinate pentru a reprezenta data calendarisict si ora. datetime data si ora fn intervalul de Ia 1 ianuarie 1753 la 31 decembrie 9999, cu acuratejea de 333 mili- secunde (1/3 secunde). Nu este acceptata nici 0 dati calendavistick in afara intervalului 1753- 9999, smalldatetime - data si ora fn intervalul de Ia 1 ianuarie 1900 ta 6 iunie 2079, cu acuratefea de | minut. Observatie: SQL Server teprezinta valorile datetime sub forma a doi tntregi de 4 octet fiecare, Primul inteeg reprezinta numarul de zile dinainte sau dupa data de refering& 1 ianuarie 1900. Al doilea intreg reprezinta ora din 2i tn nilisecunde fa de miezul nopfi, Valorie smalldatetime sunt ropre- entate cu 0 precizie mai mict, find folosti doi tntegi de cite 2 octet Primo fntreg reprezinta numfrul de ile dinainte sau dupa data de referinté 1 ianvarie 1900, iar al doilea mimarul de minute fath de miesul opi. Gonstantele de tip data caledaristict se reprezinté th formatele specifice, find ineadrate intre apostroafe. Exemple: 4 "04/15/98','15/04/98,"15 April, 1998" TIPURI SIR DE CARACTERE ecco Definese giruri de caractere de lungime fixii sau variabils, char{(n)] sir de caractere non-Unicod eu lungimea fixti de -n caractere (octeti). Parametrul n poate lua valori de 1 la 8000, Dimensiunea reprezentisi este Ue re uctefiindiferent de mtrimea actual a sirului de caractere reprezentat. Spatial ramas liber dupa ultimul caracter al girului reprezentat se completeazi cu ccaractere spativ, varchar{(n)] - sir de caractere non-Unicod cu lungimea varia- bila de pana la n caractere (octet) Parametrul m poate lua valori de 1 la 8000, Dimensiunea reprezentarii este numarul de caractere din sirul reprezen- tat si nun care indic& doar dimensiunea maxima accep- ‘atl, Lungimea actuald a sirului de caractere poate fi 0. Observati 1, Dac parametrul n nu este specificat, atunci se considert implicit valoarea 1 in declaratile de varibile sou de stribute, sespectiv valoarea 30 fn functia CAST. 2, Tipul char este folost atunci cAnd este de asteptat ca valorle datelor 4 aba aproximativ acceasi dimensiune, in timp ce varchar se foloseste ori de cate datele pot avea dimensiuni greu de estimat ori care variaz4 in plae larg Constantele sir de caractere se pot reprezenta fie apostroafe, fie inte ghilimele, adrate intre Exemple: ‘abe’, “abota” TIPURI SIR DE CARACTERE UNICOD Definesc siruri de caractere Unicod de tu nehar{(n)] fixa sau variabil ~ sir de caractere Unicod cu lungimea fix de caractere, Parametrul poate lua valori de 1 1a 4000, Dimensiunea reprezentirii este de 24n octeti indiferent de marimea ac- tual a sirului de caractere reprezentat. Spatial rimas liber 1 15 dupa ultimul caracter al sirului reprezentat se completeazi ‘cu caractere spatiu, nvarchar{(7)] - sir de caractere Unicod ou lungimea vaviabila de pan’ la n caractere, Parametrul n poate lua valosi de 1 la 4000, Dimensivnea reprezentirii este dublul mumfrului de caractere din Feprezentat si nu 2%n care indic8 doar dimensiunea maxi ‘md acceptati, Lungimea actuala a irului de caractere poste fi. Observati: |. Dac parametrul n no este specificat, atunci se considert implicit Valoarea 1 fn declaratille de variable sau de atribute, respectiv valoarea 30 in functia CAST. 2, Va fi preferat tipul nvarchar tn loo de nehar ori de cdte date pot avea dimensiuni greu de estimat ori care variaz& in plaje lagi TIPURI SIR BINAR Definese giruri binare de lungime fix sau variabila. binary ((n)] dat binard eu ngimtea fxd dew octet. Parametrl poate lua valor’ dela | la 8000, Dimensiunes reprezentarii este +4 octeti. varbinary [(m) } - data binar8 cu lungimea varibilt de pat ta ‘n octeti. Parametal poate Iua valor de la 1 Ia 8000, Dimensiunea Teprezentiri este lungimea actual a date binarev4 oxteh ‘Lungimea actuala a datei poate fi 0. image + data binar& de lungime variabila de maxi- mum 231-1 octet, folosit penta reprezen tnzeaimaginilor ii 1. Dack parametrul m nu este specifica, atunci se considers implicie yaloarea I in declaraille de variable sau de atibute, respectiy * valoarea 30 fa fanctia CAST. 2. Vafi preferat tipal varbinary in loc de binary oti de cite datele pot ‘ven dimensiumi greu de estimat ori care variazi in plaje larg. Constantele binare se reprezinté ca siruri de cifre hexa prefixate cu Ox. Exemple: OKAF, Ox10 10. ALTE TIPURI DE DATE cursor reprezinta o referingl la un cursor 31 poate fi asociat lunei variabile sau unui parametru de iesire al unei pro- cceduti stocate, Operatile permise asupra variabilelor de tip cursor sunt cele éctinite pentru cursoarele propriu-zise. Tipul de data cursor nu Poate fi folosit la definirea unei coloane fntr-un tabel, sqlvariant - este un tip de data care poate stoca valor ale oricui tip de dati suportat de SQL Server exceptind text, ntext, image, timestamp si sql_variant. sql_variant poate f folosit pentru definirea de coloane, parametri, variable si valori de retur ale functilor utilizator. 1, © coloand de tip sql_variant poate confine valori de tip diferit in ‘tuple diferite. 2. O valoare sql_variant poate avea pint la cel mult 8016 octet O valosre de tip sql_variant trebuie converiti explicit la tipul dort {nainte dea fi folosita in operat.” 4. In genetal, un obiect de tip sql_variant are asociat un tip de baz care este dat de tipul valoriicontinute, Atunei cénd aceastt valoare este NULL tipul de dat este nedefint, exceptind situafa in care se Aefineste 0 valoare implicita pentru obiectal respect, Un obiect sql_variant nu poste avea un alt sql_variant ca tip de baz 5. Coloanele de tip eql_varlant pot iachuse fn constrdugeri UNIQUE, orcticie primara sau de cheie strin8 eu condiia ca dimensiunea cheii sau a indexulu si nu deplgeasca 900 octef. > Ww ee If fable - este un tip de dath special care poate fi folosit pentru stocarea relatiilor rezultat. Permite declararea variabilelor de tip table sub forma: Sintaxa: ‘unde: DECLARE @variabila_tabel TABLE (definifie_tip_tabel) definitie tip tabel ~ defineste 0 structurd de tabel in mod similar ev instructiunea CREATE TABLE. Obsorvatii: 18 1. Att functiile, ct gi variabilele se pot declara cu tipul table, Vati bilele table se pot folosi in functii, proceduri stocate si batch-uri, 2. Incepind cu versiunea SQL 2000, variabilele de tip table sunt intro- ‘use ca alternative la tabeleletemporare gi ofero serie de avantaje ~ © variabilé table are un domeniv de vizibilitate bine delimitat care este functis, procedura sau batch-ul tn care este defini; ~ In domoniut shu de vizibiltate o variabila table poate fi folositt la fel_ca orice tabeli (in instruciuni SELECT, INSERT. UPDATE 5.aum.d.) exceptdnd umatoarcle INSERT INTO @variabila_sabel EXEC procedurd stocatt, SELECT lista_select INTO @variabila_tabel FROM 3. Nu sunt permise opera de arbuire care st implice variable de tip table, timestamp + este un tip de dati pentra care sistemul garanteaza generarea automatt de valori binare unice la nive. Tul bazei de date, ‘Tipul timestamp este folosit pentru a crea etchete unice pentry {upleletabelelor. O valoare de tp timestamp este siccath pe § actefi Otabelt poate avea osingur8 coloant de tip timestamp. © valoare de tip Hmestamp este modifica ori de cite ari tla ‘care 0 contine este inseratt fntr-m tabel sau esto actualizata uuniqueldentifier este un tip de data care defineste un identifcator unic global (GUID). Acesta permite generarea de valori unice la nivelul bazei de date, datetime > smalldatetime-> float > real-> decimal-> ‘money smallmoney-> bigint > int -> smallint > bit> image» ‘timestamp-> | Sas ae peat | 1.2. Variabile O variabila local Transact-SQL este un obiect care contine o valoare de ‘un anumit tip. Variabilele locale pot fi folosite in igierele de comenci (batch- uri) sau in procedurite stocate. Situaiile tipice de utilizare ale variabilor locale sunt: * ca $i contor pentru numararea si controlul numérului de parcurgeri ale unei bucle; Pentru a stoca 0 valoare ce va fi testatl de o instructiune de control; Pentru a tranemite 0 valoare ca parametru la o procedura stocata; + pentru a salva o valoare ce va fi retumata de o procedura stocati 1.2.1. Declararea unei vai ile Jpstuctiunea DECLARE iniilizeaz4 une sau mai variate pre: * Gareuires cite unui nume. Nomele varibilelor trebuie, in mod obligatoriu, sa tnceapa cu un singur caracter @, ator) i a unei lungimi. Pentru varibilele numetice se atibure de asemenea precizia si scala, * Se seteazl vatoarea variabilei la NULL, Sintaxa: DECLARE ({ @variabila_locald tip data ) '( @mume_variabila_ cursor CURSOR } \{ TABLE(efinite tip tabel)) [,n) unde: @variabita_locata - este numele variabilei care se declart ‘ip_data -tipul de datt al variabitei; Gnume_variabtd cursor - nomele unei variabile cursor, ce poate fi privita ca un pointor la un cursor; definitie_tip_tabel - defineste o structura de tabel in mod’ similer ex instructiunea CREATE TABLE. Exemple: 1. Declaratia unei singure variabile @:x de tip int: DECLARE Ox int Se pot declara mai multe variabile prin aceeasi instructiune DECLARE, separind prin virgula defini variabilelor: DECLARE @xuno varchar(30), BPrenume varchar (20), Goras varchar (25) _Observatie: ‘Tipul de data si lungimea trebuie specificate pentru fiecare variabilt in parte chiar daci 0 declari mai multe variabile de acelas! tip, De | exemplu declaratia de mai jos este incorectt DECLARE @x,@y.@2 int % Domeniut de vizbilitat al unei variabile locale este reprezentat de ‘multimea instructiunilor care pot referi variabila, ‘Domenial unet Fauabite locale neepe din punctul in care este declrata pang la sfrgtal fsieralui de comenzi (batch) sau al procedutil stocate in care n feet eclaraté. Declaratia unei variabile poate fi, in principiu,plasata ovtunde 1n cadral figierului de comenzi sau a procedurii stocate Secventa de mai jos genereazs o etoare de sintaxA deonrece variabila @x ste declaratl tn primul batch (terminat prin comanda GO) si referita ta al doilea: DECLARE 8x ner SEP tx = 1 00 SEUHCT Gx 3. Declarata unei variabile de tip cursor presupune specificarea cuvEntului cheie CURSOR: DECLARE Gx CURSOR 4 Declaratia unei variabile tabel trebuie s8 contind o descriere de structurk tabel precedatt de cuvantul cheie TABLE (¢n cazul nostra structura tabelei consti dinu-o singura coloand, Nume): DECLARE @P TABLE (nune varchar(20)) 1.2.2, Atribuirea de valori unei variabile La declararea unci variabile valoarea ei este implicit setata la NULL. Fentru a atribui o valoare unei variabile se poate utiliza fie instructiunea SET, fie instruetiunea SELECT. Instructiunea SET a fost intodus’ incepand ct versiunea 7.0 a SQL Server si este metoda preferatt prin care se atribure valori ‘unsi singure variabile. De asemenea, se pot atribui valori uneia sau mai multor Yariabile referindu-le int-o lista de atribuiri a unei instructiuni SELECT. Instructiunen SET nu poate fi folositi pentru.a atribui valori la mai multe variabile, dar este mai eficienta decat instruefiunea SELECT. Bxemple: Seovenja de mal js declar tei variable, le asigneazA vals, gi apoi le Fetumeaed intr-un rind print instretiune SELECT. DECLARE @x int, @y int, @2 int declare vaibile SEP Gx=i inializare Gx SPLRCT @y=2, 0203 ~inijaliare @y si @= SELECT ex, @y,@2 ~igualiare De regula, dact o variabila este referita ntr-o list SELB 8° atribuie variabilei o valoare scalar, fie instructiunen SELECT returneazi un Singur rnd, din care rezulté o valoare unicl care se atribuie variabil DECLARE @rumar_furnizori int SELECT @nunar_furnizori-cOUT(*) FROM Furnizori Dac& totusi o instructiune SELECT retumeaz mai mult de un rand si variabila refera 0 expresie nescalara, atunci vatiabila este setati la veloarea retumati de expresio prin ultimul rind al rezultatului, Seovenja de mai jos atribuis variabilei @nume numele primului furnizor fa ordine alfabeiied (altimul selectat fn ordinea descresctoare dupa atributul Nume) DECLARE @nume varchar(30) SELECT enune = Mme FROM Purnizeri ORDER sy None DESC SELECT Omune 1.3. Exercitii $i probleme 1. Fiind date dectarafiile de variabile: : DECLARE @b binary DECLARE #0 char DECTARE @4 Sine DECLARE @e eql_variant Si se arate care dintre urmatoarele atribuiri este corect si care nu: : SEP ebeOx32 3) Gate este valoarea afiyati pentru variabla @y in urmitoarele seven: | ee DECLARE @y int DECLARE @y amalline. Ser exdelt SEE dx-0NPPBE 2 SEP @y-ox. SELECT ey SEP ey=ax SELECT @y '. _Explicafi care sunt erorile in seevenfa urmitoare: DECLARE @x TABLE(a INT) SET ox = 1 SELECT @x 4. Corectati urmatoarea secvenfai de instructiuni: DECLARE Ga, 6 int Un operator este un simbol care specified o amumita Operatic executati Wide gant mai multe expresi operand. fn SQL Server coer ‘urmatoarele li de operatori: ‘Operatori aritmetici; ‘operatori de atribuire; ‘operator pe biti; = Speratori de comparare; = operator logici; 7 Operatorul de concatenaresiruri de caractere; = operatori unari, ri aritmetici peratri executl operatii matematice asupra a doua expresii de tip numeric. Operatori aritmetiei sunt: Oper Semaine | aaa =| Seldere + ati 7 [ Divistne. © | Modal ~ amend eal a Impatience Observatiiz % Reratorl modulo se apis numai unr operinzi de tip tne 5 Feaumetza ca rezultat tot un intreg. De exemplu: 12% 3'= 2 sca ‘estul Impaririiniregi a lui 12 la 5, 2 Operator + s- se pot folosi si pentu opera asupra unorvalori de ‘ip datetime 5i smalldatetime. Operatorul de atribuire Operatori pe bi Cocratori pe bili aetioneazA asupra a douk expresil de tip fatreg si realizeaz& una dintre urmatoarele opera la nivel de ‘Operaior Somat 4 | Operas AND (Sipe bit 1 operatis OR GAU pe bi =| Operatis XOR (SAU exch poi Operatori de comparare Pot aplica asupra tuturortipurilor de expresii exceptind text, ntext sau image. de comparare acceptati de SQL Server sunt: ‘Operator Serna eae >| Mai mare = Taam 3= [Mal more sas ga <= [Mat nie sa eat =) bites 15 | Dit ou ete preva andar SED << [Nu mai mic deat (nu est prevent in standard SQL [Nn are eet et previa sind SQ Observatii: 1 Reaultatuloritrei operati de compsfare este de tip boolean, avind unt din valorile: TRUE, FALSE sau UNKNOWN (fn cazal compar rrafillor cu valori NULL), 2 ‘Spre deosebire de ete tipuri de date din SQL Server, tipul de dat enue. Poste fi pecifiat ca vpul de dat al une eoloane sat {atiabile si ow se poate retumna intr-o relate renultat Expresile Wrnrgite S© BOK folosi doar fn urmétoarele contexte: clauzele WHERE sau HAVING, expresii CASE, instructiuni IF $i WHILE. 25 Operatori logici 3. Dack optiunea SET ANSILNULLS este ON,..tunci orice operator de comparare care are unol sau doi operana cu valoare NULL va returna valoarea UNKNOWN, Dacl optiunes SET ANSI NULLS este OFF, atunci se spied neeleagt roguliexceptind operatoral de cgalitate (=) care returneazX TRUE dot ambll operenz! sunt NULL. Asifel vwstul, NULL = NULL retumeast TRUE decd ‘SE! ANSI_NULLS este OFF si UNKNOWN dact SET ANSI_NULLS este ON. t pp naw inating ingen ireoreman aban gaara Operatorit logici testeaz Valo ‘operatorii de comparate, oper faunal donditii. La fel ca si frefurmeagt a valoare de tip OWN. boolean care poate fi TRUE; PALS! a Seniesa at TRUE Tacos compte Gav tat TRUE, TRUE dich ene , opera at a ‘TRUE, UNKNOWN dnc wa expe ete UNKNOWN 4 ccallt TRUE, repeedy FALSE da ue din expres ese Page contin ty ose “TRUE dick cpu de compare Saran ate an TRUE TDETWHGEN [TRUE dt pend oe ou vale (aia EXISTS | TRU deck osublnecnueremencd eel pono ol “TRUE deck eperandl ne egal a et puja una dine valanTe By sel ete ered sa se reat reat. TRE "TRUE dsc peranda expect uments. TRUE deck operandi exe FALSE, FALSE dack operand nor ste TRUE 9 UNGNON ech optandal exe UNKNOWN. ‘TRUE dack ext pin wn di expesile booleme dle a on termed ete TRUE, PALSE Guct ante expres sit FALSE i UNKNOWN net ‘TRUE dock el pin a deity Compare Gira ae Se som | TRUE 3 Operatorul de concatenare 26 Operatorul de concatenare a girurilor de caractere este notat cu semmal de adunare (+), Aceasta este singura opetatie de manipulare a sirurilor de caractere care se realizeazi printr-un operator, toate celelate find realizate prin difeite functii. Observatie: 1. Implicit, sirul vid este interpretat ca atare tm operafile de concatenare, De exeinplu: ‘abe’ +“ + “def produce ca rezultat ‘abeder’ 2. inal vid nu trebuie confundat cu valoarea NULL a unui gir. De exemplu: ‘abe’ + NULL + “def” produce ca reznitat NULL, adic un sir cu valoare nedefinita Operatori Unari Operatorié unari executa o operatie dati doar asupra unei singure expre- sii de tip numeric. Operatorii unari din SQL SERVER sunt: ‘Operator Semnifale "t_—| Valoarea numeric este pot Valoata igativl a opeandul =] Gompiementul fad de uns ab operandatar (Bitwise NOT) Precedenta operatorilor Precedenta operatorilor determina ordinea de execufie a acestora tn ceazul unor expresii care contin 0 secventi de operatori. Un operator cu prece- dent mai mare este executatinaintea altuia cu preceden{a mai mic. Precedenta ‘operatorilor din SQL Server este datl fn ordine descrescatoare astfe ‘Operant Una ‘Operator arama muliplead ‘Operairi aromatic | > (Adinae), + (Conaionr) sai: “Seaser) ‘Operator de SoS SSeS | comparare: i [Operator pews [<1 ‘Operatral de gate loin wor, [Operatoral Sage [ AND ‘ALL, ANY, BETWEEN, IN, LIKE, oR, Som Dac& doi operatori dintr-o expresie au acecasi precedent, evaluarea lor se face de la stinga la dreapta fn ordinea aparitiei lor tn expresie. Ordinea implicita de executie poate fi moditficata prin folosirea parantezelor. 2 Operatorul BETWEEN Operatorul LIKE ‘Sintaxa operatorului BETWEEN este urmitoarea: ‘expresie_test (NOT] BETWEEN expresie_de_la AND expresie_pina_la § reuneaza valoarea TRUE daci expresie test are valoarea tntre Gipreiie_de_ta si expresie_pina_la (inclusiv) si FALSE in caz contter {in varianta fir NOT). Prin folosirea operatorului NOT se revereenes Yaloarea rezultatului returnat, Observati 1. Operatorul BETWEEN realizeazA umn test inclusiv, Pentru a face un test exclusiv se vor folosi operatorii > si <, 2. Dacti oricare dintre cele BETWEEN sau NOT B tatal este UNKNOWN, frei expresii operand ale operatorilor ETWEEN au valoarea NULL, atunci rezul- Detemmind dact un sir de caractere dat respectd sau nu un anumit gablon (astern). Un gablon poate include atit caractero obignuite, cat 31 ‘aractere de inlocuire (wildcard). La compararea unui sir de caractere ca in sablon caractercle obignuite trebuie trebuie si se potriveasc& exact cur ‘aracterele din sir. in schimb, caracterele de inlocuire pot fi inlocuite cu fragmente arbitrare ale sirutui de caractere. Prin folosirea caracterclor de inlocuite operatorul LIKE devine mult mai flexibil decat operator sau <, ‘Sintaxa operatorului LIKE este urmatozrea: ‘expresie_sir_caractere [NOT] LIKE sablon [ESCAPE caracter_escape] unde: expresie_sir_caractere — este orice expresie care se evalueazi la un sir de caractere valid in SQL Server. sablon ~ este gablonul eu care se compart sirul de caractere. Sablonul poate confine urmitoa. rele caractere de inlocuire: fer oe] —— Snlocuire pee iss ae | Once nement dey cooing 2270 sa mule earactere, a sing caracer oarecare. [ty | Sree caret dinwsar So mar inerval oe (| Ores caraier ears na Tate pane 1) | insane oa isa er este orice expresie valida de tip gir de Caractere. caracter_escape nu are valoare ‘mplicita si const& dintr-un singur caracter, Operator) LIKE retumesza TRUE da: Potriveste cu sablonul specificat caracter escape ch expresie_sir_caractere se Observatii: |. La compararea unui sir de caractere prin LIKE toate caracterele din Sablon sunt semnificative, inclusiv spaile de la incepat sau sfirsit De exemplu: ‘abe! LIKE ‘abe * Feturneazi FALSE, Totugi, aceste spatii nu se iau in considerare la sirul de comparare. De exermplu oricare dintre comparafil: “abe "LIKE ‘nbe*, ‘abe * LIKE ‘abc’, ‘abe * LIKE ‘abe returneaza TRUE. 2. Regula de comparare a spatiilor se poate manisfesta in mod neasteptat atunci cand se fac comparatii cu variebile seu eémputi avdnd tipul de data char sau varchar, Un char de o anumiti mumérut de’ zie curse dela 1 ianuie 2000 53 pina fa da caren 2.2.1.4. Funetii sistem (conversii) Dintre funciile sistem de tip scalar prezentim in acest paragraf doar functile de converse. Funcfile CASK si cele pentru tratarea valorlar NUL vor fi prezentate ulterior. ‘in SQL Server, sunt posible dou’ niveluri de conversi hte tipurite de dae: + Clind data dintr-un object este mutata, comparata sau combinata cu 6 dati dintrn alt obiect- data. poate fi converts din tipul de dati al unui object f tpul de dat al celuilalt obiect. ‘+ Cénd data dintr-o coloana rezultata dint-o tranzactie SQL, codul returnat sau parametrul de isire al unei proceduri stocate este mutat ‘nt-o variabila program, acesta trebuie convert fa tipul de data al variabili Exist dou categorii de conversi © Conversiile implicite care sunt transparente pentru uilizator. SQL Server converteste automat datele dintr-un tip in altul ori de cite ori este posibil. De exemplu daci smallint este comparat cu un int, atunci smallint este convertit implicit la int inaintea comparari ‘+ Conversiile explicite sunt realizate de catre utilizator prin folosirea functiilor CAST sau CONVERT. Funcfiile CAST si CONVERT Realizeaza conversia explicit a unei expresii de un amumit tip in at tip. CAST si CONVERT sunt similare in fumofionare, fiind diferite ca sintaxa. Functia CAST este compatiil® cu standardul SQL'92 si este preferaté (acolo unde este posibil!) fata de CONVERT care este specifict SQL Server, Sintaxa: Utiliednd CAST: CAST(expresie AS tip_data) Uiilicénd CONVERT: CONVERT (tip_data ((lungime)), expresie [,t) vunde: expresie - orice expresie SQL Server valida, tip_daia - tipul de data yinta furnizat de sistem. Tipurile de date ufilizator nu pot fi folosite in conversi fungime parumctraepfons! sl tiprlor de date uchar, hnvarchar, char, varchar, binary sau varbinary stil ~ este stilul formatului de dati calendaristica folosit la conversia datetime sau smalldateime Ia un. tip caracter (pure nchar, nvarchar, char, varchar, nchar, sau nvarehar), sau format unui giv ednd se converteste float, rel, money sau smallmoney Ta an ip caracter + _intabeta de mai jos primele dout coloune din stanga repezinl valorle free poate aven parametrul sti! in cazul converse! de la datetime sau tetime la un tp caracter. Beal | Casecol : Sandor thar isi eee tae a SSI poe sara — ae gat tee ‘a eee —— aoe tr aa i ——t- fee Sy a ee ry ii [mm-dd-5 a i eee BBO) iin i) eer vi iemaT) pe ee aD ic) ee ened nar Tiplicte Gat 0 seu 100, 9 sau 109, 13 su 119, 20 sau 100 GOT sav 12 tordeauna sexo (999). ‘1, Implicit, SOL Server interpreteaat cele dout cite din an conside- | tlnd anv 2049 ca an de refering, Aceasta inseamna cf anul 49 © interpretat ca 2049, ir anu 50 interpret ca 1950, 2. Cand se converteste un smalldatetime la un tip caracter, silurile ce ‘includ seeunde sau milisecunde vor avea zero i aceste paviti, Tabelul urmator indies natura ‘caracter In functie de parametrul stil: | Valoare J Tegire © Gol) | cite mani. Vina a notte ia, cand sre iT [hiteasa fe. Inodeam atk meric ate] 2 Toideauna 16 site Tnotdcauna Flos in oti siaes conversiei din float sau real Ia un tip {In tabelut urmttor colouna din sting reprezinttvalorie parametrului sit in cazul conversiei money sav smallmoney la un tip caracers [Vana a Tesi ard Viel ia Hesare we cife dio saga panera zim © imp a Grrl leadout ci a dap puneute td Ee ase A Virgua dope fecare te cif la stinga punctual acim ca oul cite dupa pont zcinl De exenply, 3.51052, let vig a ese ei cife din snga puneulus aod lt bir cif reapin punctlu ncimel. Deen 4235 9819, Observati 1. Conversiile implicite nu sunt suportate de citre tipurile text si ‘mage. Se pot inst converti explicit date de tip text la tipul caracer si date de tip inmage la binary sau varbinary, dar lungimea maxima ‘care poate fi specificata este 8000. 2. Daca se Meearcd o conversie care nu este posibilé (de exemplu o expesic de tip caracter care include litere la int), SQL Server gencreaza un mesa de eroare. La conversia expresiilor de tip caracter sau binar (char, chan varchar, varchar, binary sau varbinary) la o expresie de un tip diferit, data poate fi runchia,tiparita partial sau poste fi resurnata 6 eroare, Exemple: SELBCT cAST(123 AS chax(3)) reman'123 SEUECT CONVERT (char(3),223) = remlat "123 SELECT CAST(123. aS char(2)) rent SELECT CAST(123 AS char (d}) rez ‘123 SEUBCT-CAST(123 AS varchar (4}) rezahat 1 SEUECT CASP(GBTDATR() AS varchar(12)) —rezutat‘Jl 132001" SBUBCT CONVERT (varchar (12) ,GETDAME(),3) —realtt OTA SELECT CONVERT (varchar (12) ,GETDATE(} ,103) -reraltat ‘130772001 41 2.4. Exercitii gi probleme A. Si se indice rezultatul returnat de urmaoarele operatii SELECT: SELECT POWER|2,0.5) ‘SELECT SORT(9) ‘seuecT noumD(748, 1) SELECT ROUND|48.58, 1) SELECT ROUND(79.34, 1) ‘SELECT ROUND(701, “2) SELECT ROUND(12.i2, 2) SELECT CHARIWDEX “aa, ‘aaaaaaa‘) SELECT CHARINDEX( "aa", “anaaaaa’ 4) SELECT LEFT( ‘abedet',2) SELECT RIGHT(" abcdef', 4) SELECT SUBSTRING[-abcdet” 2,3) SELECT REPLACE (‘abeabeabe", ‘a’, ‘abe*) SELBCT CAST('123° AS char(2)) SELECT CAST('07/13/01" AS datetine) SELECT CONVERT varchar (12) ,CAST(*07/06/01" AS datetine) ,1) SELECT CONVERT (varchar (12) ,CAST(*07/06/01' AS datetime) /102) SELECT CONVERT (varchar (12) , CONVERT (datetime, 07/06/01", 1) .6) SELECT CONVERT (varchar (12) CONVERT (datetime, 07/06/01".3) 6) 2 3. TABELE $I INDECSI Tabelele sunt cele mai importante obiecte dintr-o bazk de date relational. Toate datele sunt stocate in tabele organizate sub forma de linii gi coloane. Fiecare tabeliicorespunde unei relatii din schema relational a bazei de ‘date. Liniile tabclci corespund tuplelor relate iar coloanele corespond atribu- telor acesteia, 7 Proiectarea unei baze de date presupune, in primul rind, stabilitea colectici de tabele gi a descrierii tabelelor Impreuna cu toate proprietitile asociate, fnainte de crearea unci tabele noi trebuie luate 0 serie de decizii de proiectare referitoare la: ~ tipurite de date care vor fl stocate in tabela; ~ coloanele tabelei si tipul de daca (eventual lungimea) pentru fiecare coloana; = coloanele care (nu)acceptt valori NULL; — constrangeri, reguli, valori implicit = indecsi necesari, coloanele care formeazi cheia primari ori care ‘sunt parte a unei chei straine Odatit proiectata baza de date se poate trece la crearea tabelelor in care Vor fi stocate datele. Stocarea datetor se face fa tabelele permanente care sunt erupate in una sau mai multe fisiere ale bazei de date. Pe lings tabelele Permanente, in SQL Server, exist posibilitatca de crea tabele temporare ‘Acestea sunt similare tabelelor permanente, eu excepia faptului e& sunt stocate {in baza de date sistem tempdb de unde sunt sterse in mod automat de indat ce ‘hu mai sunt folosite, Tabelele temporare pot fi locale sau globale. Numele unei {abele temporare locale incepe cu simbolul #, ea este vizibilé numai pentra utilizatorul curent si este distrusd cénd acesta se deconecteazi de la SQL. Server. Numele tabelelor temporare globale incep cu #, sunt viibile peatra ‘oti utilizatorii (care an drepturi corespunzitoare!) si sunt pastrate in Sistem and fa deconectarea ultimului utilizator care le foloseste, 3.1. Instructiunea CREATE TABLE Creeazii o nous tabeli ‘Sintaxa (simplificata): CREATE TABLE [mune_baza_date proprietar || proprietar. nume_tabel ({ |< consiringere_sabela> } [.m}) 43 mume_baza date — este numele bazei de date fn care se ereeazt tabela, ‘paca nu se specific, atunci tabela va fi creeatt tn baea de date curenta, proprietar ~ este numele utilizatorului care va fi proprietarul tabele} Dac nu se specifics, atunet proprietarul va fi chiar utiliza. {orul curent. Numai utilizatorii privilegiai, cum ar ft adnan, nistratorul de sistem, pot ctea tabele pentru alt tilizator ‘nume_tabel — este numele tabelei care se creenzs. Combinaria proprietarnume_sabel trebuie $8 fie unica la hiivelul bazei de date. Mite coloana — se refert ta defiitia completS a unei coloane ; ‘impreuna cu constrangerileimpuse asupra sa | Comstringere tabela — se referd ta constrlngeri exprimate la nivelul tabelei si sunt, in general, constréngeri care nu Pot fi exprimate la nivel de coloand sau se exprim® mai avantajos la nivel de tabela. finirea unei coloane lunei coloane se face dups urmatoarea sintaxi: ecoloana > ::= {nue coloana tip_dara } UIDERAULT expresieconstanta}{ IDENTITY { (origine,increment)}] ROWGUIDCOL) [ ] Intane_coloana AS expresie coloana_caleulate | J G ‘oloana —_— este numele unei coloane din tabela. Numele de coloani poste fi omis dact tipul de dath este ‘timestamp, caz in care numele coloanei este chiar timestamp. ~ specifica tipul de data al coloanei Poate fi un tip de data sister sau un tip utiizator, DEFAULT expresie_constanta ~ specifica © valoare implicité care este atribuitd ori ie cite mi se specifica 0 valoare explicit pentra coloane corespunzitoare, Aceustl optione nu se poate aplica daca tipul de data al Spganel este timestamp ori pentru coloane eu propricatca 1D) i eeresie_constanta poate fi constants, Yaloarea NULL sau o functe sistem (de ex. GETDATED) ~ indied © coloant pentru care SQL Server generea- 24 in mod automat valori incrementale, uniee Ia nivel de tabela, IDENTITY Proprietatea poste fi asociatt tipurilor de date tinyint, {ihallint, int, bigint, decimal(p,0) sau numerie(p,0). f-6 fabeld poate exista cel mult o singurd cbioend co ENTITY. Origine “este valoarea care se attibuie in coloana IDENTITY pentru prima tupla inserata in tabelt. Dack parametrul origine lipseste, atunci se considert implicit valosrea 1, increment ~ este valoarea de increment fat de valoarea ultimei tuple inserate, ste implicit 1 lipsa unei specificari explicit ROWGUIDCOL -indic& faptul c& nous coloant este de tip unigueidentifier, pentru care sistemul accepta ‘pumaj valori generate prin fanctia NEWID care Baranteazi unicitatea valorilor la nivel de baz de date, O tabell poate avea cel mult o singurl coloand et pro- prietatea ROWGUIDCOL. Proprietatea ROWGUIDCOL 1m sine, aw geranteaz4 unicitatea valorilor si nici mu gone reazd automat valorile unice, Pentru a genera valori unice se va folosi functia NEWID la orice operajie de inserare in aceasti coloand, constringere_coloana 82 referd la 0 constringere exprimaté la nivel de coloana, 4s nee | expresie_coloana calculata — este 0 expresie cate defineste valoarea pentru 0 coloana catcutata © coloani calculata este o coloand virtualé care nu este stocata fizie in baza de date, ci este calculati printi-o expresie pe baza valorilor din alte coloane ale tabelei Expresia poate fi. numele unei coloane, 0 constant, 0 functie, © variabil8, respectiv orice combinatie a acestora ‘Expresia unei coloane calculate nu poate fi o subinterogate. Coloanele calculate se pot folosi in clauzele SELECT, WHERE, ORDER BY din interogtti gi fn orice loc unde este legala plasarea unei expresii cu respectarea urmétoa- relor restrict + Ocoloans calculatd nu poate f folosita la definirea unor contrangeri de ip DEFAULT sau FOREIGN KEY, hu poate fi definitt cu opfiunea NOT NULL. i, 0 coloans calculata poste fi folosita ca gi cheie de indexare, ca parte a cheii primare sii se poate asocia © constrangere de tip UNIQUE, cu conditia ca valoarea calculata a coloanei sa fie objinuta printr-o expresie deterministt si tipul de dati al rezultatului expresiei fie unul acceptat pentru coloanele de indexare. De exemplu, daca tabela are coloanele de tip intreg a si b, fatunci coloana calculaté a+b poate fi indexata, tn timp ce coloana calculati a+DATEPART (dd, GETDATE() feu poste fi indexata deoarece valoarea ei se poate Schimba in timp si va falta la fiecare invocare. + Ino coloana caleulat® nu se pot insera valor prin insuefiunea INSERT, respectiv nu poate fi modiicatt prin UPDATE. Exempla: 1." Tabela Persoana, creat prin instructiunea de mai jos, are urmatoarele coloane: ~ ID, coloand de identificare unica, cu proprietatea IDENTITY, Pentru care se vor crea automat, in ordinea introducerii tuplelon, valorile: 12,3 5.a.m., ‘Nume, sit de caractere pentri stocarea numeluis = Arul_nascerd, coloana de tip intreg cu valoarea implicit 1950; Virsta, coloani calculati ca diferenfa dintre anul curent si anul hasteri, va indica la orice referire varsta actuala a persoanei, 46 CREATE. TABLE Porsoana ( x int rDENTTTY, Mane varchar (15), anul_nasterii int DEFAUL? 1950. Virsta AS DATEPART (vy,GETOATE()}-Anul nagterii , De remarcat cla inserarea unei tuple in tabela Persoana singurul limp pentru care trebuie specificata o valoare explicité este Nume. Pentru fone celelalte cémpuri sistermul este capabil si furnizeze valoti corespunzatoare dach este nevoie, Astfel, daca se executa secventa INSERT Fersoana (Mune) VALUES (Ton) ‘SELECT * FROM Persoana ~inseraretupa abel ~afigare conpinut abel imediat dupa crearea tabelului, atunci se objine uemsitorul rezultat: (1 row(s) atfectea) ‘Anul_nasterss viet 1950 31 [1 ow(e) aftecteay 342 Constrangert A Constringerile asociate unei tabele se pot defini fie la nivel de colony fie la nivelul tabelei. Constringerile sunt proprietiti speciale prin elf 4 asiguid integritaea datelor. Anumite constringeri au ca efect eieeiien de indecsi pentru tabele si coloanele acestora, in SQL Server se pot defial urmatareleeategorii de constdngeri 4 + NOT NULL, prin care se interzic valorile NULL pentru © anvinill coloant; + PRIMARY KEY cste constringerca de integritate a relajtl cafe impune valori unice si nenule pentru coloanele care fee parte din cheia primera; * UNIQUE impune valori unice pentru una sau mai multe eoloane, este de fapt mecanismul de definire al cheilor candidate din tabeld; + FOREIGN KEY este constringerea de integritate referenyiald, Valorile cheitstrdine trebuie 58 fic © submultime a valorilr chell dintr-o tabela referita; ‘+ Constringeri CHECK, prin care se impune ca valorile dint-o anumité coloand si satisfac o expresie logica specifiatd, este 0 form& de realizare (partial) a integitiidomeniuli pin restitio- narea valorilor care pot fi tribute unei coloane $4.24. Exprimarea constrangerilor la nivel de coloana ‘urmitoarea: “= CONSTRAINT none canringre {ENULL NOT NULL ] wel NCUPRoaRY KEY oMtoOR ) (CLUSTERED INONCEMSrERED | 1 1 JCHECK [NOT FOR REPLICATION} emrasie inpco) ’ unde: Iebuie si fie unic la nivelul bazei de date, tabeld dats, nivelul unei tabele Ee nisi pentru definirea consttngerilor la nivel de oloant este CONSTRAINT mnume_constringere — cuvatal cheie CONSTRAINT marcheaza inceputul definiticl meet constran- FeoaicaeeConstringere este numele constringeri. Newels PRIMARY KEY ~ defineste o constrtngere de cheie primar pentru mpoata Curent. Poate exist o singurt che primart pent s UNIQUE - constrangere de unicitate, impune valori unice Pentru coloa- nivelen td Pot exista mai multe constréngeri de tip UNIQUE la CLUSTERED, till ut index (consteingere) "de tip CLUSTERED. Un index de tip CLUSTERED este mai chcie’ storia feptuui cd se mapeaza peste ordonareafzicé a tuplelee in baza de date (Se: sorteazt tuplele dupa cheia indexuluj CLUSTERED) FOREIGN KEY ... REFERENCES — marcheazs inceputul defintiet Coloene: Sonstige de cheie string peau unaane °° multe coat: Aceasté constrngere impure condiis ce site valoare a SHpoanel curente si se repdseasca printe seloric coloane} cofeana.referita din tabela tabela_referta Asupra_coloanei feleana.referita teebuie s& existe defini » Constrangere de tip ONTOARY KEY sau UNIQUE. sau un indore optiunea, UNIQUE. ‘abelo_referita— este sumele tabelei referite intr-0 constringere de tip FOREIGN KRY. (coloana referta) — este numele coloanei refetite Prin constrdngerea FOREIGN KEY. ON DELETE (CASCADE 1 NO ACTION) — specifica tipul de date tui cate SQL Server va meatine intogitaca treet fo late io cazul unt operat DELETE care ine te conflict cu date ca tabela cuenta (do referinja), mt sunt posit, legaturi refereniale ttre baze de date diferit, Optines CASCADS wt care itelinita pentru operatia DELETE daca existt defiait n: ‘eieger INSTEAD OF DELETE pentru abel in dscunte ON UPDATE (CASCADE | NO ACTION) ~ specifics tipul de Gulimne prin care SQL Server va mentine integritatea beset do date fn coz une! operagi UPDATE care intl tn contin 1800_ AND ‘Anul_nasteri {= { CONSTRAINT nume_constingere] (PRIMARY KEY UNIQUE } (CLUSTERED | NONCLUSTERED ] {(Coloana [ ASCIDESC 1,2} } 1 IPOREIGN KEY (coloana (,]) REFERENCES tabela_referita{(coloana_refevita,n})] (ON DELETE ( CASCADE |NO ACTION }] [ON UPDATE { CASCADE INO ACTION } } ( NOT FOR REPLICATION ] | CHECK [ NOT FOR REPLICATION ] (esprese_logica) st coloana ~ Gite © coloanl sau list de coloane peste care se defineste constrangerea, (ASCIDESC] ~ specifica ontinea tn care se sorteazt coloanele parti- Cipante la definiea constréngerii. Optiune implicitd este ASC, n ~ indie repetarea into list a unui anumit tip de element, ‘Tote celelate clemente de sintaxt igi pastreara semnificatia de Ia Aefinitia constrangerilor la nivel de coloand cu urmatonlc deosebiri Consiringere de tip PRIMARY KEY sau UNIQUE Ia nivel de Tags Poste defini poste mai route coloane si are ca arpuvent de coloane, ‘Contrangerea FOREIGN KEY specifica lista explicitt a coloanclor GRRE formeazA cheia strsina. Aceasts list trebuie si corespundd ane + Weunu ca tists coloanelorrefrite din tabela refers, ” Expresia logic atayaté unci constringeri de tip CHECK la nivel de [bold poate face referire la orice coloand, dar numai din ahcle a defini o cheie primara sau o cheie striind formats din mai multe constrangerile corespunzatoare trebuie exprimate la nivel de Climpurile CI si C2 formeaaa cheia prim: “are este referiti de in tabela Referinta. REATE TABLE Reforita ( ct int, 2 ine, PRIVARY KEY (c1,c2) CREME TABLE Referinta RCI int, Red int FOREIGN KEY (RC1,nC2) REFERENCES Referita(ci,c2) i Observatie: Gonstrngerile la nivel de coloana trebuie definite imediat dupa speci- 3 . mite ibulu de datt pentru coloanarespectvy ele sa parte a defi- | (Prdinea de specificars a constringerlor este abitcen Gonswangerile ia nivel de tabla pot fi specificate ern fn definifia ule’ trebuie despite prin vingula de definite de oloana sau de Aehinilealtor constringri De exemplu, in varenta do soe jos, tabela i Egferia mai contine dout constringer’ de tip CHECE (C1s@2 51 : Ch>c2+10), CREATE TABLE Referita ( ca ane, cc ica>c2+20), 2 int, PRUORY KEY (c1,c2), cuzck (c1 (DEFAULT expresie_constanta (WITH VALUES }}) [,n] ‘(WITH CHECK I WITH NOCHECK } : ADD ( }L, n] i lAbD (DEFAULT expresie_constanta [FOR coloana | (WITH VALUES })[,n] iro on { i {CONSTRAINT J nune_consringere | COLUMN coloana J, ; | 'UWITH CHECK! WITH NOCHECK || CHECK INOCabeK } j CONSTRAINT ( ALL | mume_constringere{yn}} 3 i obligatoric gi accasta este valoarea cu care se realizeazi in mod eA SAB) THRO LATE tee) melons [. {ADD | DROP) ROWGUIDCOL | — 0 coloani de tip me ROWGUIDCOL nu poate {i modificats, ci numai adiugata nume_tabel — este numele tabelei care se modific8. Daca tabela nu este ‘n baza de date curenta sau nu este proprietatea,utilizatorului ccurent, atunci se va specifica explicit numele bazei de date gi/sau proprietarul ALTER COLUMN nume_coloana ~ specific’ modificarea coloanei ‘nume_coloana. Coloana modificatS nu poate fi *° 0 coloana avand tipul de dati text, image, mtext sau timestamp; coloana cu proprietatea ROWGUIDCOL; © coloan’ calculatt sau 0 coloant folositi intr-o coloan’ calculata; © coloand folosita tnt-un index, int-o cheie primara ori cheie straind; © coloani pentru care s-a definit o constrangere CHECK sau UNIQUE; + ocoloana pentru care s-a definit o valoare DEFAULT. tip_data_nou { (preciaia [, scala ]) — este tipul de dati now, asociat eu coloana modificatl, tmpreun cu precizia si scala definite pentru acest tip de data. tip_dara_now trebuie si respecte urmatoarele crite ‘+ datele existente trebuie si poatd fi convertte implicit la noul tip de data; tip_data_nox nv poste fi timestamp; daca coloana modificata are proprietatea IDENTITY, aturici ‘ip_data_nou trebuie si fie un tip de dati care suportt aceasta proprietate, NULL | NOT NULL ~ specific daca coloana poate accepia sau nu valori NULL. Orice coloand nou adaugathtrebui, fie st accepte valori NULL sau s& alba definitt o valoare DEFAULT. Dack coloana adiugatt accept valori NULL si nu are definita 0 valoare DEFAULT, atunci coloana va fi initializat’ cu valor NULL pentru ficcare tuplé a tabelei. Dacd coloana adiugata accepta Valori NULL gi -a defint gio valoare DEFAULT, atunci prin folosirea opjiunii WITH VALUES se poate forja inifalizarea coloanei cu valoarea DEFAULT. Daca coloana nu accept valori NULL, atunci definrea valorii DEFAULT este (ADD) ori stearsé (DROP), ADD ~ specified adfugarea a una sau mai multe coloane sau constrangeri definitie_coloana ~ are aceeasi semnificatie ca 1a instructiunea ‘CREATE TABLE. (DEFAULT expresie_constanta [WITH VALUES ]} ~ opfiune cere dfineste valoarea implicta, data prin expresie_constanta, pentru coloana adaugats. Nu se poate aplica coloanelor IDENTITY sau ROWGUIDCOL. WITH CHECK | WITH NOCHECK ~ specificd daca datele existente sunt sau nu validate in raport cu o constrdngere now adaugati sau reactivati. Opfiunea WITH CHECK este implicité in cazul unei ccontrangeri noi, iar WITH NOCHKCK este implicita in cazul cconstrangeritor reactivate. Opfiunile WITH CHECK si WITH NOCHECK nu pot fi folosite pentru constringerile de tip PRIMARY KEY si UNIQUE. Constringerile definite cu optiunea WITH NOCHECK nu sunt uate in seamA de sistem, fiind ignorate péni in momentul reactivarii lor print-o instructiune ALTER TABLE cu clauza (CHECK CONSTRAINT ALL. constringere_tabela - are aceeasi semnificatie ca la instructiunea CREATE TABLE. ADD { DERAULT expresie_constanta{ FOR coloana | { WITH VALUKS) ~ definirea unei valori DEFAULT pentru o coloant existent. DROP ( [ CONSTRAINT } nume_constringere | COLUMN coloana ) ~ specifica stergerea unei constrdngeri ori a unei coloane. Se pot Serge mai multe coloane si/sau constréngeri printi-o singur’ clauza DROP. O coloank ns poste fi stears8 dact. = este folosita intr-un index; ‘este folosita intr-o constringere CHECK, FOREIGN KEY, ‘UNIQUE sau PRIMARY KEY. 35 SS a SSE cee een eT ( CHECK | NOCHECK) CONSTRAINT ~ specifica activarea (cu optiunea CHECK) ori dezactivarea (cu opfianea NOCHECK) constrangerilor de tip FOREIGN KEY si CHECK. ALL — specifick faptul c& tonto constringerile sunt activate ori dezactivate, mume_constringere ~ numele constringerilor care sunt activate ofi dezactivate tn mod selectiv, (ENABLE | DISABLE) TRIGGER - specific activarea (cu optiunea ENABLE) ori dezactivarea (cu optiunea DISABLE) trigger-clor definite pentra tabela in discuie. ALL - specifica faptl c& toate trigger-ele sunt activate ori dezactivat, ume trigger numele trigger-clor care sunt activate ori dezactivate fn tod selectiy Observatii: 1. La folosirea instructiunii ALTER TABLE trebuie avut in vedere faptul cA modificirile ta definitia unei tabele pot avea ca efect ‘modifictri implicite asupra datelor existente sau generiri de date pentru coloanele: noi. Aceste operafii pot fi mari consumatoare de resurse si de lunga durata, 2. Daca intr-o tabela sunt modificate coloane care sunt referite print-o Constringere de tip FOREIGN KEY, atunci modificdtile se propag’ si asupra tabelelor de referinta tm cazul optiunii CASCADE. oti ‘modificarea initiala este revocata dact optiunea este NO ACTION. Exemple: B in scoventa de mai jos se creeaz infil tabela Pou un singu etm ID th care se insereazé dows tuple. Ulterior tabela este modificatt prin adiu- garea coloanelor A, 2 si C, dup care se afigeazA continual tabelulu CREATE TABLE T (2D int) 0 INSERT T VALUES (1) RNSERT T VALUES (2) co AUPER TABLE T ADD A int mot, completa implicit ox NULL. Bint NOT MOLL DEPAUL 10, —completare ca valosea 1D int Nuut DEFAULT 11 —fajeaca comptes WITH VALUES ou valoara I ‘SELECT = FROM? Rezultatul obinut este: 1 i 2 at (2 rowis) attectea) ipstructiunes urmitoare definste 0 valoare DEFAULT pentru coloana 4 A.ubelei 7 din exemplul precedent. Tuplele existente tn tabeld ow ane fi modificate. ‘ALTER TABLE T ADD DEFAULT 111 FoR A wim VALUES Instructiunea de mai jos modific tipul de data al coloanei 1D din tabela T la numeric cu scale 10 5 precizia 5, ALPER TABLE T ALPER COLIN 1D nuneric(20,5) Dups aceasta modificare continutultabetei Teste urmatorul » a 3.00000 mut 2/e0000 moe (2 rows) atfectea) Prin instruetianea de mai jos adaugim o constringere de tip UNIQUE Pentru coloana /D a tabelei 7: ALTER TARLE T ADD VATOUE (ro) Instrucfiunes de mai jos aiaugt la tabela 70 constringere care intra in Conflict cu valorite existente in coloana B, motiv penteu care se semnaleazi o eroare si constringerea nu este addugata ALPER TABLE T ADD CHECK (B<>20) Totusi, dacd instructiunea este executat cu optiunea WITH. NOCHECK, atunei constringerea este acceptatt si ea poste fi apol sctivata, fra a avea efect retroactiv asupra tuplelor existente in tabela 7; ‘ei numai asupra modificarilor uherioare de date: ~defnzeconsingere fra vrisieate ALPER TABLE WITH NOCHECK ADD CHECK (be>10) OK, setvare constingere ALTER TABLE T CHECK CONSTRATIT ALL 7 UPDATE 7 SET B=B ‘are la inlocuire vloric le nse Observatic: La reactivarea constringerilor optiunea implicit este WITH NOCHEK. Dacd in exemplul de mai sus reactivarea constrangerilor tabelei T s-ar face cu specificarea explicit& a optiunii WITH CHECK, printr-o instructiune de forma: AUTER TABLE WITH CHECK CHECK CONSTRAINT ALL atunei sistemul ar genera o eroare din cauza conflictelor dintre datele tabelei gi constrdngerile definite. 3.3. Instructiunea DROP TABLE ‘Sterge din baza de date definitia unei tabele tmpreund cu toate datele confinute, constrangerile, indecsii si triggerele asociate. Toate vederile sau procedurile stocate care fac refeire Ia tabela care se sterge vor trebui s& fe ster- se in mod explicit prin instructiuni DROP VIEW sau DROP PROCEDURE. Sintaxa: DROP TABLE mume tabla unde: ‘nume_tabla - este numele tabelei care se sterge. Observatii 1. © tabela mu poate fi stearsi atta timp edt este referita printr-o constringere de tip FOREIGN KEY. Inainte de stergerea tabelei referite trebuie stearsi constrlingerea FOREIGN KEY sau tabela de referintt, 2. Instructivnea DROP TABLE nu se poate aplica tabelelor sistem ale SQL Server. 3.4, Utilizarea instructiunilor CREATE TABLE gi ALTER TABLE {in acest paragraf ne propunem sh prezentim un exemplu de definire a tabelelor pentru 0 baz& de date pe care o numim a Agenfi. Schema relajionali a acestei baze de date Va fi folosita ca model de referinti fn capitolele urmatoare oriunde in exemple va finevoie si ne raportim la o anumit& structurd de date. 58 ‘Fig. 3.1. Diagrama bazel de date Agent 59 Movlelul conceptual al bazei de date Agent este definit asf: Murnizor(coar, mune, oras) Beneficivr(Coas, Mine, Oras) Sune, UH) ude, Prec, cantitatey odP, Fret, Cantitate) Y CoP, CodB, Cod, Prat, cantitate) le subliniatereprezinta chele relator; CodF din Oferte si Traneactii, Codd din Cerert $i et, respectiv CodP din Oferte, Cereri i Tranzactt sunt chei sireferd flecare tabela in care apar ca sichefe primaras CodF-CodP din Tranzactié este cheie strina si refera corespunzatoare din relajia Oferte; CodB-CodP din Tranzacté este cheie strand si refers corespunzatoare din relatia Cereri. ma bazei de date Agen este dati fn figura 1. Variant pentru secventa de comenzi care creeaz& tabelele este urmatoarea: TABLE dbo Beneficiar ( Ane IDENTZTY (2, 1) wor MULL , varchar (50) NOT MULL , 8 varchar (50) NULL PK Beneficiar PRIMARY KEY NONCLUSTERED ABLE dbo.corere ( Ant NOP NULL, . “ Ganikitace int wos, CONSTRAINT PX_Cerere PRINARY KEY NONCLUSTERED i cous, oar “CREATE TABLE dbo.Furnizor ( Code int TORWTZIY (1, 1) NOT NULL , ‘ome varchar (50) NOP NULL» Oras varchar (50) wot, CONSTRAINT PR_Furnizor PRIMARY KEY NoNCLUSTERED t coar > ) oo CREATE TABLE aho.oferte ( ‘cod int NOP MULE Coa? int NOT NOLL | Pret soney NULL Cantitare snt Nuit + CONSTRAINT PK_Oferte PRIMARY KEY NONCLUSTERED 0 coar, oar ) CREXTE TABLE dbo Produs ( Goa? nt OBMTZTY (1, 1) NOT NULL tone varchar (50) NOP NULL ‘om varchar (50) NOLL CONSTRAINT PK_Produs PRIMARY KEY NONCLUSTERED fi coaP , 1 CREATE TABLE abo -Teanzactsi ( Cod int IDENTITY (1, 2) NOT NULL , Coa ine NOLL coaB int NOLL | GoaP int NLL | Bret money NOL , | Caneitate int NULL CONSTRAIWT PK Tranzactii PRIMARY KEY NoNcLUSTERED c coat ) 1 ALTER TABLE dho.cerere ADD CONSTRAINT PR_Cerere_Beneficiar FOREIGN KEY £ code ) REFERENCES Gbo.Boneficiar ( cea ¥ Clsamasie #X_cerereProdus FOREIGN KEY a ‘ coar } ) REPERENCES abo, Pradus ( 3.5. Indecgi coe? , In SOL Server se creeazi indecsi in special pentru'a realiza un acces “ mai rapid [a datele din tabele. Un index este o structura auxiliara care ALTER TABLE dbo.Oferte ADD | ‘ordoneazi tuplele unui tabel dupa valorile a una sau mai multe coleane ale sale. CONBTRAMIT FK_Oferte_Purniaor FOREIGN Key Indexul contine referine la tupleletabele gi acest referine sunt ordonate dupa ple ! iiterile: specificate la definirea indexului. SQL Server foloseste indecsii ) REFERENCES abo.rurnizor { pentru optimizarea interogarilor pe care le are de rezolvat atunci cind Cour f construieste planul de executie al fecarei interogiri. Acest proces este, in | principiu, transparent utlizatorului care, desi nu poate decide direct modul de be CONSTRAINT FROferte Produs FOREIGN XEY C folosire al indecgilor, este cel care ia decizia referitoare la coloanele care se indexeaz in momentul eredtii indexului. Aceastt decizic este influentati de ) REFERENCES dbo.Produs natura interogarilor care se anticipeaz8. De regula, se vor indexa coloanele care oor figureazi cel mai frecvent ca $i crterii de cdutare in interogiri, Folosirea coae i ; | i inubclr fcettogy cb tio tase Cwm Se te te men ' co. ‘ncetinirea operatilor de inserare, stergere si actualizare, Numfrul potrivit de indesst pentru un tabel ese, in mod claro deciie de proiectare influent de raportuldintre frecveatainterogilor si cea a operaflor de modifcae date. In cos eneral este recomandabil i e evite exces de indesi un mar de eel ml Y REPEREAS abo. nonettcier ( 7 indeesi per abe ind considert un optim empirie penta marea majorite oo 2 aplicatilor. COuSMAIIG PRLEranzactLt_Cevere FOREIGN KEY Dintr tipurle de indesp cae se pot defi c . care prezinta un interes special: ALTER TABLE dbo Tranzactii ADD CONSTRADY? PH Teansactii Bonetictar FOREIGN REY SQL Server, tei sunt cele om os iia nigel a Wi gels ea a a ) aries a.caere ¢ semen ions ich = = Tnerie eels pret eal ata leas oa ; set vebcinsobncs eden aes vies NULLS Siuoroat me tvanscttturnsoe Fone tn {7 tated ip Cove i baer pl a do fe terdonmes per bck lca nese ot feat nee snare foie at hace rns aged eoncounibomsttdenit a lS ner on rp oe ts ronal Pate ‘ SIS we pou tea ellie taped cheer ie binsrmont me trencectsogerte romero sex GSNSWRDIT PRtrncectssoterte FREI eared cour, coaP Definirea unor constrangeri de tip PRIMARY KEY si UNIQUE se ) RECERENCES dbo.oferte { ‘materializeaza, in mod automat, prin crearea de citre SQL Server a indecsilor cose, de cheie primara si unici corespunzitori , TT 3.5.1. Instructiunea CREATE INDEX unde: Permite definirea unui index pentru o tabela sau o vedere, ‘Sintaxa(simpliticati): (CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED } INDEX aume_index (ON { tabeiaIvedere } (coloana { ASCIDESC}{ ,n}) (WITH (IGNORE_DUP_KEY IDROP_EXISTING) {,n) ] ‘UNIQUE — indicd faptul c& indexul va fi de tip unic. fnainte de crearea uunui index unic, SQL Server verifica dacd datele existente satisfac conditia de unicitate a cheii de indexate si refucd ‘recarea indexului dact conditia nu este satisficutt, Valorile NULL multiple se considera duplicate la crearea unui index nic Daca exista un index UNIQUE, atunci operajiile UPDATE sau INSERT care ar genera valori duplicat ale cheii de indexare sunt fejectate integral si se genereaz’ un mesaj de eroare. Daci este specificata optiunea IGNORE_DUP_KEY, atunci la o opcratie INSERT numa tuplele care genereaza duplicate sunt rejectate, restul fiind inserate. fn cazul unei operatii UPDATE optiunea IGNORE_DUP_KEY nu are nici un efect. CLUSTERED ~ indicd faptul cl, pentru indexul creat, ordinea fizica coincide cu cea logics. Poate exista un singur index de acest fel pentru o tabela sau vedere. Este recomandati crearea indexului CLUSTERED inainte de creearea celorlali indecsi, deoarece la rearea indexului CLUSTERED are loc reordonarea fizicd a tuplelor tabelei ccea ce implica recreearea tuturor indecsilor deja defini NONCLUSTERED - crecazi un index cate specificd 0 ordine logic& a tuplelor tabelei sau vederii. NONCLUSTERED este optiunea implicit la crearea unui index. Se poate crea un index NONCLUSTERED pentra 0 vedere numai dact existt deja un index CLUSTERED definit pentru aceea vedere, nume_index ~ este numele indexului; trebuie $8 fie unic la nivel de tabelA sau vedere. ‘abela — este numele tabelei pentru care se defineste indexul. vedere — este numele vederii pentru care se defineste indexul, Facilitatea de indexare a vederilor apare pentru prima dat la versiunea SOL. Server 2000, coloana ~ se referé Ia coloana sau coloancle care se indexcaz4. Daca ve SPeciticl mai multe coloane, atunei se creeaai un index compozit a cirui cheie rezultd din combinarea coloanelor specificate x Coloanele se vor specifica in ordinea prioritati de sortare, {ASC | DESC] ~ determina natura ordontrii ta index pentna valorile unei coloane date. Opfiunea implicité este ASC. TGNOREDUP_KEY — controleazt funcjionarea operator de {NSERT in cazul situatilor de conflict eu un index UNIQUE ‘Vezi optiunea UNIQUE. DROP_EXISTING - dact existt deja un index ou numele celui care se Greeaza, atunci se va recrea indexul vechi confrom definiie! noi Aceasti clauzi imbundtateste performanja la reerearea indexului CLUSTERED pentru o tabelA sau vedere care are gi ali indecsi, find mai eficients dectt combinatis un nou CREATE INDEX. 3.5.2. Instructiunea DROP INDEX ‘Sterge unul sau mai multi indecsi. Instructiunea DROP INDEX nu se Fac azupra indecsilor creat implicit prin definirea unor constringeri de tip PRIMARY KEY sau UNIQUE, Sintaxa: DROP INDEX nume_tabela.index | nume_vedere index n | unde: ‘nume_tabela | nume_vedere ~ specific& numele tabelei sau a vederii circia fi-este asociat indexul ‘index — este numele indexului care se sterge, Exemple: 1. In seeventa de mai jos st reste un index uni, de tp clustered, cu umele /sNume, peste chmpul Nume din tabela Furisor ZF mttora (seLscr same Frm sysinderes vent none = Tawine") ‘nor INDEE Purnizor.ahoe 0. ; CREATE UNIQUE CLUSTERED TEX Tetuse OW Furnior (ime) 65 Daca mu existi nume duplicat tn tabela Furnizor, atunci operatia se realizeaz eu succes. De remarcat ci pentru constringerea PRIMARY: ‘BEY definita pe cémpul CodF 5-2 folosit optiunea NONCLUSTERED, deci este posibil si definim indexul IxNume cu optiunea CLUSTERED. Dup& definires acestut index se va semnaliza eroare la orice tentativa de inserare sau modificare date care ar produce nume duplicat in tabela Furnizor. Astfel dupa a dova instructiune de mai jos: INSERT Purnigor VALUES(*IRT8", ‘cluj+) INSERT Furnizor VALUES(*TRIS*. Clu} ") sistemul va afiga urmitoral mesaj Cannot insert duplicate Rey row in object Funizor’ with nique inde tetas: The statement hasbeen ierminated ‘n acest exemplu vom crea tn index unie pentru cémpul Nume din tabela Beneficiar, dar cu optiunea IGNORE_DUP_KEY: IP EXISTS (SELECT name FROM sysindexes WHERE name = ‘IxMume") DROP INDEX Seneficiar. Taiune 0 cneare umtgue cwszenD INDEX Tattine ON Beneficiar (tune) wom ToNORE_DUP_xKEY De remareat of indexul definit pentru tabela Beneficiar are acelasi nume cu cel definit pentru tabela Furnizor. Numele de indecsi trebuie 68 fie lunici doar Ia nivel de tabela. Ca efect al optiunii IGNORE_DUP_KEY | a doua operatie de insetare de mai jos mu se insereaz& nimic, oi doar se genereazi un mesaj de avertizare: INGERT Denofietar VALUES(‘IRIS', ‘Cluj INSERT Deneficiar VALUES(*TRIS", 'Cluj') Mesajul de avertizare este: Duplo ey was inored Instruetiunea de mai jos creeazi un index compozit pentru tabela Tranzactii: CREATE INDEX Txcodurt ON ‘teanzacts (CodF,Cods,coar) Tndexul este creat peste coloanele CodF, CodB gi Cod? este implicit nonclustered simu are proprietatea de unicitae. gi probleme Sa se indice care dintre exemplele de mai jos sunt corecte 9 eave ‘daca este cazul si se arate erorile din urmAtonrele istrefi sau seevente de instructiuni: A. CREATE TABLE T(A int PRIMARY KEY, B int PRIMARY KEY) bi cReare TARDE 9(A int) [ALTER TABLE ADD PRIMARY KEY (A) CREATE TABLE T(CHECK (AcH),A int,B int) . CREATE TABLE T (A int PRIVARY xEY al FOREIGN KEY REFERENCES ‘T(A) ©. CREATE TABLE TIA int IDENTITY PRIMARY KEY) {. CREATE TABLE T(A int IDEVETTY (0,0)) ae & CREATE TABLE TYA int IDENTITY, B int rDEMEUEY) Fie tabela 7 definiti prin instructiunea: T (A Ant PRIMARY KEY FOREIGN KEY REPERENCES 1(8), B int UNIQUE FORRIGH KEY REFERENCES T(a}) Este definitia tabelel corects? Daca da explicati ce se intimplt In executarea operatillor de inserare de mai jos: INSERT 1 values (2,2) INSERT 7 valves (1,3) De ce form trebuie si fic tuplele acceptate de tabela 7? Fie tabela 7 definita astfel: CREATE TABLE (A tinyint IDENTITY (0,128), ine) ‘Si se execute seevenfa de instructiuni de mai jo INSERT T values (2) INSERT 7 values (2) INSERT T values (3) Explicati cele constatatet = 0 2 3 SH se moditice cheile primare ale tabelelor din baza de date Agent astfel inet si aiba la bazi indecsi de tip clustered. | 4. INSTRUCTIUNI DE CONTROL. | FISIERE DE COMENZI 4 Sit se definensea Indecsi de tip unic pentru cdmpul Nume din tabelele Furnizor, Beneficiar si Produs. (BATCH-URI) 5. Sa se adauge constringeri de tip CHECK pentru coloanele Pret $i Jnstraciunite de conto din Limba Transact-SQL sunt cele dn abel Canttate din tabelele Oferte, Cerri i Trancae b eff OL i limba rnaeact SO snl dn mba { [teres | prs S Si se adauge cite 0 coloant cakulatd tabelelor Oferte, Cerert gh BEGIN-END —| Dring min dehamss Tranzactit care 5X repretinte valoaren pentru fecare ofets, cevete REAR Dern ete oa bla WHILE Ca sau tranzacie. ‘CONTINGE | Reps Sticoe ae WHUEE CContiows prelucraren cu insuuciunea co urmeadd Soph | OPO steht | sichets soeifcall prin GOTO, 7. Rescrieti exemplu 2) din paragraful 3.12.1. folosind instructiunea 1r.ELSE, Forae colbines, 8 ot ALTER TABLE in locul com! ai nat, optional, alematvt end cour inafiel DROP-CREATE TABLE. i ‘RETURN Tesite neconditionata din procedure caren t [WAKTFOR. ‘Suabileyteo nvérziere pentru exscuia net atc | aie Repel o secvenj do instuchol ata timp ct condia specific este devin Urmitoarele instructi legatura cu instruc} i Transact-SQL sunt folosite freevent tn stréns ile de control enumerate mai sus: | Pc! (Comentariu) EXECUTE : = Comentarin) PRINT | CASE RAISERROR 4.1. Comentarii H Limbajul Transact-SQL accept8 dout tipuri de comentarii: ~text_comentari care indica un comentariu 1a nivel de linie; textul din linia curenté aflat dupa i simbolurile "--" este ignorat de SQL Server; /*ext_comentariu_mult-linie*/ ccare indica un comentariu multi-line; textol aflat fntre perechile de simboluri "/" si "1" este ignorat de SQL Server. Base Be ee eee Observatie: SQL Server nu impune nici o restrictie referitor ta tungimea ‘comentarilor, indiferent de tipal ler, 4.2. Instructiunile BEGIN si END Instructunile BEGIN gi END sunt folosite pentru « grupa mai multe Instructiuné tnt-un singur bloc logic. Perechea BEGIN. END delimiteaza 0 secvenf de instructuni care formeaza un bioc. Blocurile BEGIN...END pot | imtbricate, | Sintaxa: BEGIN {nistructiune_sal | bloc_instrueflunt_sé ng _instructiunl_sql} ‘grup de instructiuni definite ea un bloc. Pentru a defini un bloc de instructiuni (batch), se utilizeaz’ cuvint ciie BEGIN END. In pina ay nace Se tle ‘part tnir-an bloc DEGIN. BND, resi creapar sunt cele care fe ete, $i ln bteh-ur,inruet erice blo este pare a unui bath as nase eee tiuni nu pot fi grupate th acelasi batch. i Insrutinile BEGIN gi END se floss, trttdeauna, cao pereche i Cadrul acelin batch i incadreaaho stove de insrcfunl cae te ble cada ttl Peehea BEGIN END a floc ode este necess ruparea logica a mai multe instructiuni it te ae nce grpaen lope ama mut ruin. Ces die ste + hut WHILE cure urn ma mt eo nstusne : * un element al unei functii CASE care trebuie s2 8 neler: f trebule st includ boc de ‘lau IF sao BLSE cae cuprnde mai malt deo instuciene \ | } unde: i Ainsiructiune_sgl | bloc_instructiuni_sql} - este orice instructiune sau Exemp Dact oinstuctune IF contzoleazd execusa doar a unt singure fi, ane nu ese neces folsiree preci BEGIN Tae = TF (@8zRROR <> 0) SEP CErrorSaveVariable = gasxnon {in seeventa de mai sus se sare peste instructiunea SET daci @@ERROR este 0. Dac este nevoie s& se sari peste mai mute instrucfiuni, atunci se foloseste BEGIN... END ca in scovenja de mai jos: IF (@8ERROR <> 0) SUSU ger exrrorsaveVariable = @€ERROR PRINT ‘Error encountered, * + (CAST (@RrrorSaveVariable AS varchar(20)} exp 4.3. Instructiunea IF...ELSE Impune conditii tn executarea instructiunilor Mn functie de rezultatul evaluariiunei expresii booleene. Dacd conditia este satisfacuti se execut instrctiunea sau blocul de instructiuni ce urmeazi cuvantului cheie IF si conditiei. Cuvantul cheie optional ELSE introduce un bloc de instructuni care se executa atunci ednd condifia IF nu este satisfacuta. Sintaxa: IF expresie_booleana (instrucitune_sql\ bloc _insrucftunt_sql) [ELSE {insructiune_sql\ bloc. instructiunt_sql)) unde: expresie_booleana - este o expresie ce returneazi TRUE sau FALSE. Daca exprésia booleand contine o instructiune SELECT aceasta trebuie si fie inclusd inre paranteze {instrucfiune_sgl | Bloc_insiructiuni_sgl} - este orice instructiune sau grup de intructiuni (bloc) {in lipsa unui bloc de instructiuni, conditia IP sau ELSE poate afecta executia unei singure instructiuni. Pentru a defini un bloc de instruetiuni se uilizeazt BEGIN...END. Observati: |. Constructia IF..ELSE poate fi folosita in batch-uri, in proceduri stocate si fn interoglri ad-hoc. 2. In anumite situatii, expresie_booleana se poate evalua la valoarea ‘NULL, caz in care aceasta se interpreteazi ca si FALSE. n 3. Testele IF pot fi imbricate, fc dupt alt IF sau dupt in ELSE. Nu ‘exist limitari la numérul de niveluri imbricate. fn cazul imbricarilor, se aplica regula implicits prin care fiecare ELSE se impereehanes og cel mai apropiat IF care nu are pereche ELSE Exemple: 1. In seoventa de mai js se testeand da exit cel putin un furneor in tatela Furnizo, caz fa eate se returneazA numele furor famizeriion alefel se afigeaza un mesajindicandabsentafurnizosilons 1 exists setecr + Fro Purnizorl) BEGEN PRN ‘Lista furnisorilor este:+ SELECT Mune Prom Pusnisors Buse PRINZ ‘Na exista furntzorit* 2. rice proceductstocath care salveazA codul de eroate returnat de cdtre \ariabilaglobala. @ @ERROR pe timpul executieiunei tranzacti, webuie i alba la sfirsitul procedurii un IF similar cu urmatorul: IP (@rrrorsavaVariable <> 0) BEGIN PRINT ‘Brrors encountered, rolling back, PRIN? ‘Last error encountered: 5 ASE (@ErrorSaveVariable AS VARCHAR (10) ) ROLLBACK Buse BEGIN PRINT ‘No Errors encountered, comitting. + coma Exp RETURN @Errorsavevariable .4. Instructiunea WHILE SeteazA o conditie pentru execuia repetath a unei instructiuni sau bloc Instucfiuni SQL. intructiuile sunt executate repetat atta timp edt condfia ‘specificalteste adevaratt. Executiainstructiunilor din bucla WHILE poste ft ontrolats din interiorul buclei folosind cuvintele cheie BREAK si Sintaxa: WHILE expresie_booleana (insructiune_ sql bloe_instructtun sql) [BREAK] (instruttune.sal | Bloc instrucunt sql) (CONTINUE) z unde: . ‘tpresie_booleana - ete 0 exprese booleand care returneazk TRUE sau FALSE. Daca expresia boolean confine 0. istrutions SELECT aceasta trebuie inlusé inte parantezs (instructune_sol | bloc_instructiuni_sql) ~ esto orice instructiune Transact-SQL sar grup de instructiuni definite ca blow ea ajutoralcavintelor cheie BEGIN gi END I BREAK ~ este o instructiune care poste utiliza ca optiune @ insruetiunli WHILE si areca efectiepirea din cea mai nterioart bucla WHILE. Execitia se continua cu instrutiumea ec apare dupa cuvdntul cheie END, ce marcheazisfisitul bucei euente, i Instructiuiea BREAK este, de cele mai multe ori, dar au in mod necesar, actveté de un test TF. : st © instruciune care poate fi utlzath ca optiune a t junii WHILE. si areca efecttrecerea la iterafia urmatonre a buclei WHILE, Toate instuefimnile de dupt cuviatul ches CONTINUE pina la cuvaatalcheio END, ce marcheazd srt | buclei eurente, sunt ignorate, iar contolul ente tansferat la Tnceputul buclei WHILE. Instuctimnea CONTINUE este de | cele mai multe ori, dar nu fn mod necesar, activaté de un test IF. t Observati Jn cea a dow sau mai multe bucle WHILE imbricat, o nstuctune BREAK din bucla cea mai interioara determint ‘iesirea in urmatoarea : boucld exteroard. Se executd toate instructinile din ucla imedat i exterioart alate dupi cuvintul cheie END, ce marcheazs sScitl buclei I curente, dup ere setrece la inceputul bucleiextrioare. Exemple: 1. Tn seven de mi jos frnizorl eu cod FYI meso peti a ; ofertele sale pina cdnd moda pretrilor prope ajunge la nivelul mode Dreturlorpracicte de fuizorul cu codul F2. Procesu! se Fnzerupe acd prezl maxim al ui F111 deplgest pe ce al ui F2 (al dil TF en B oriunde intr-o procedurd, batch sau bloc de instructiuni, Instructiunile GOTO BREAK), dar numai dact media preturilor lui FY este cel putin jumBtate pothijnabcleaio. din media preturilor tui F2 (primul IF cu CONTINUE), in caz contrat Continuéndu-se cu marirea prefurilor. Sintaxa: WHILE (SELECT AVG(pret) FROM Oferte WHERE Coaf=:F1') < (SELECT AVG (prot) PROM Oferte WHERE Codf='32") Bxcre ‘UPDATE oferte F . A i ‘SEP pret = pret + it Modifiet ordinea de execu WHERE Coats="Pi ~nidcegte toate preturite cu 10% GOTO eticheta IF (SELECT AVO(pret) FROM Oferte WERE Codfs'F1") < (SELBCT AVGIpret) ¥ROM Ofezte WHERE Godfa'F2")/2 comme: unde: ‘ticheta - este punctul in care sc transfers executia dact eticheta apare {nte-o instructiune GOTO, 3 (SELECT MAX(pret) FROM Oferte WERE Codf="F1') > (SELECT WAX(pret) FROM Oferte WHERE Codt=-F2") Eltichetele respecti. regulile obignuite pentru. identificatoi =D eK Etichetele pot fi folosite ca si comentarii fie c& sunt sau nu invocate Intro instruetiune GOTO. 2 Gazal tipic de utlizare al instruetiunii WHILE este t contextul Observatie: cursoarelor, in acest caz_instructiunea WHILE testeazs valosren i Yariabile globale @ @FETCH_STATUS care exe stale instrctinnes Instructiunea GOTO nu poate st speifce 0 etchett din aira batch FETCH. Vacabla @@FE7CH_STATUS are valoaren 0, dock ones ull cutent, dar poate si contin o eichetS defintt fie inant, fie dupa executie a instructiunii FETCH s-a terminat prin incdrcarea cu succes a | a Unei noi lini ta cursor. Seevenfa de mai jos definegte un cursor peste tabela Fumitor, iar bucla WHILE confine o anumita prelucrare pentna | Utilizarea instructiunii GOTO trebuie fieuta cu precautie. Utilizarea fiecare furnizor incdreat in cursor. excesiva a instructiunii GOTO diuneaza clarititi unui batch. Secvengele de cod ce utilizeazt GOTO pot fi aproape Tntotdeauna fnlocuite folosind alte instructiuni de control. Cazul tipic de utilizare a instructiunii GOTO este pentru a intrerupe iterafiile imbricate a mai multe bucle WHILE. mags ibieletittead|cteaon pel ‘Stun © rod ma orm curser fareiaor Pere Mt Plow castor tumtaor torua eereren smmroa ora) cree seeeay simran | Seeventa de mai jos este echivalenth eu secvenja din exemplal 2) de la - forntzor | insrucjiunea WHILE, dar na floes aceasta resrohann Giose cursor_tumnizor z | DECLARE cuttor_furntzor CORGOR FOR SERMOCARE casas fo ntsor | meee anise vu curect fursiaee | Sitcarea_oursor: BPCH NET Pow cursor turntzor ir (aoreren spares aT 4.5. Instructiunea GOTO a Instrucjianea GOTO modifick ordinea de executic a insteucji ior | prelucrare furizorcurent roost segs at Sect | aio ae tu sunt execute, In schimb exeeutia continud de la etcheta specinean © oo tants COTO nce COTO ele DERE mnie seein " 5 4.6. Instructiunea WAITFOR Specific 0 anumiti ora din i ori interval de timp fat de momentul Curent Gupa care se declanseaza execujia unui bloc de insictiuni, 4 unel roceduri stocate sau tranzacti ‘ Sintaxa: WATTFOR (DELAY ‘interval_tinp' | TIME ‘moment_executie' } unde: DELAY - comunicd serverului SQL si agtepte scurgerea unei durate de timp (max 24 ore) inainte de executia instructiunii urmaitoare. “iaterval_timp'- este durata timpului de asteptare care trebuie specificat ts-unul din formatele acceptate de datele de tip datetime sau Printr-o variabili local de tip datetime. Instructiunea WAITFOR nu permite specificarea datei caledaristice, portiunea ‘eferitoare la data dintr-o valoare de tip datetime este ignorat TIME - comunica serverului SQL si astepte pani in momentul specificat de parametrul 'moment_execufie’ ‘moment execute’ - este ora din zi la care se lanseazi in exccutie instructiunea ce urmeazi dupa WAITFOR; se specifica. in acelasi format ca si parametrul 'interval_timp' Observatie: Un dezavantaj al instructiunii WAITFOR este acela cX dupa executia lunei instructiuni WATTFOR, conexiunea la serverul SQL este inutiliza- bill pant la momentul specifica in instructiune, ‘Exemple: A, In secventa de mai jos se lanseazi fn executie procedura stocati ‘update_all_stats la o ord fixa si anume 22:20: pecrw WATTPOR TIME 22:20" EWBCuTE update_eil_stats Acest exemplu aratt cum poate fi utilizatd o variabila de tip datetime i contextul opfiunii DELAY. Procedura stocati definiti mai jos este Projectatt pentru a astepta o durati de timp variabils (indicats. prin 16 a parametrul @@DELAYLENGTH), iar apoi st returnezé utilizatorului ‘numarul de ore minute si secunde de agteptare: CREATE PROCROURE time_dolay (QEDELAYLENOTH DECLARE @eRETURUINFO varchar (255) BEGIN WAYTFOR DELAY s@DeLAYLENCE SELECT @ORETURNTHFO = "A total tine of * SUBSTRING (GODELAYLENGTH, 1, 3) +! houre, * + SUBSTRING (BODELAYLENGTH, 5; 2) + ' minutes, and ' + SUBSTRING IG@DELAYLENGTH, 8, 2) + * seconds, + “has elapsed! Your time 1s up.* PRINT GORETURNINFO © (9) as Apelul de mai jos lanseaza procedura rime_delay specificdnd 10 secunde de asteptare: EXEC time_delay '000:00:20 iar mesajul rezultat este: "A wot me of 00 hours, 0 minutes, and 10 seconds, has lapsed! Your tine i up.” 4.7. Instructiunea RETURN Determina iesirea neconditionata dintr-o interogare sau procedural Executia instructiunii RETURN este imediats gi completa, iar instructiunea poate fi folosité tn orice punct al unei proceduri, & unui batch sav a unui bloc de Instructiuni, instructiunile care urmeaza dup RETURN nu mai sunt executate. Sintaxa: RETURN (expresie_tureg] unde: expresie_intreg - este 0 valoare de tip fntreg retumaté la iesirea din procedura Procediurile stocate au posibilitatea de a retuma o valoare intreagt tre procedura sau aplicatia apelant ‘Observatie: 1. fn ipsa oricsre specificaci explicte toate procedure stocate ale sistemlui SQL returnes24 implicit valoaree Oca indicatie a ‘executirii eu succes a procedurl; returnarea unei valor diferte de zero indict aparita unl eror n 2. Daci este utilizats intr-o procedura stocata, instructiunea RETURN ‘hu poate retuma o valoare NULL, Dac 0 procedura tnecarct! si {ntoarcd o valoare NULL se genereazA un mesaj de avertisment. Valoarea returmata de 0 procedur’ stocata dur stocati poate fi atribuitt unei bile locale procedurii sau aplicafiei apelante printr-un apel de forma: EXECUTE @yvaloare_retur = procedwra_apelatt Exemple: 1. In procedura de mai jos se testea dacs-a specifica ovaloare pentru Parameirul @nume_furnizor si se trece la determinares liste oferclor furnizorului nurai dack valoarea parametrului nu este NULL. th ese ontrar se afijeaza un mesa ise isd din procedura: CREATE PROCEDURE Lista_oterta( Gnume-furnlsor VARCHAR(2O) = wx 18 seune_turntzor 18 Wie a a ach ati un nme de turntzori+ SELECT Produs.Mune, otarte.Pret, oferte.cant FROM Purnizor,Oferte, Produs ae re WHERE Turnisor Osde-Oferte: coat AND Oterve,codp=Prodis Cosy ans Furnlzor.minesOnuna, font 2 _Procedra de mal jos tested dac frnzorl dat ca paramet are sav ‘nu Oferte $i returneazd valoas caz i is tu ot oarea O fn caz afirmatv, respectiv 1 in caz CREATE MOCHDURE are_oferte, finane_foraieor vane = wens HF masts stizcr "Mom Purnivor,ofarte” MUHY AS MOERE Purntsor.coatsotectercodt x0 Turtisor Mimecennefurnizee) mex rerun 1 cera i rena a age wee na furnizarea listei de oferte daca este cazul: * EE mince ser ‘Sturnizor="Terapias ae 8 IF @valoare_retur=1 RIND 'Furnizorsl ‘+@furnizor+! nu are ofe: Buse BEcTw Purnizoru] ‘4@furndzort’ are uritearele oferte:' BxEC Lists oferte dfurnizor 4.8. Figiere de comenzi (batch-uri) Un figicr de comenzi sau batch este o instructiune sau un grup de instructiuni Transact-SQL trimise la un moment dat dintt-o aplicatie care sistemul SQL Server pentrv a fi executate, SQL Server compileazA instruc- fiunile dinte-un batch intr-o singura unitate executabila numit plan de execute, Instructiunile din planul de executie sunt apoi executate ca un tot unitar. Un figier de comenzi constituie 0 unitate de compilare independenta avénd un Context propriu care nu este influenfat $i nu influenteazi contextul altor fisiere de comenzi. Variabilele declarate itr-un fier de comenzi sunt vizibile doar in cadrul acestuia Dac apar erori de sintaxd, care itnpiedick compilarea corecti a batch- tului i construirea planului de executie,atunci nief una dinte instrucfiunile din batch nu va fiexecutatt. in cazul unei erori de executie (“run-time error”), cum ar fi cele de tipul depasirlor aritmetice sau violarea unei constringori din baza de date, se pot intémpla urmatoarele: ‘© se opreste execufia instructiunii curente gi se renunfi Ja executarea instructiunilor care 0 urmeazA in “batch”; acesta este cazul cu cele ‘mai multe erori de executie; ‘© se opreste numai instructiunea curent®, toate instructiunile rimase fa “batch” sunt executate; acesta este cazul violitilor de constrangeri si aaltor céteva erori de executic. {n oricare dintre situatile de mai sus instructiunile executate pnd la {ntdlnirea unei erori de executie mi sunt afectate, Singura exceptie este dack batch-ul este inclus tntr-o tranzactie si eroarea apiruta cauzeazi abortarea ‘ranzactici (“rollback”). In acest caz. toate modificarile ficute tn baza de date inainte de apartia erorii de executie sunt anulate, supra figierelor de comenzi se impun o serie de restrict: * Un fisier de comenzi poate confine doar una singurd dintre urmitoarele instrictiuni:, CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER, sau CREATE VIEW; nici una dintre aceste instrucfiuni nu poate fi combinata cu o alta in acelagi batch 9 singur plan de executie. Utilizatorii or hoc prin utiltarele SQL Server sau pot fie rulate prin utilitarele SQL Serve Comanda GO pentru a semmala sfarsit Uiltarclor SQL. Server ea nu va fi trimisi niciodat& mai departe edtre server ul SQL. Exemple: 0 Se * Daca o tabela este modificatt mtr-un batch, atunet coloanele noi ale ‘acesteia nu pot si fie referite tn acelagi batch Dacit o instructiune EXECUTE este prima intr-un batch, atuaci cuvintal cheie EXECUTE poate fi omis. Cuvantul ches EXECUTE esto necesar doar daci instructiunea EXECUTE au este prima th batch, 4.8.1. Comanda GO ‘Indica sfigitul unui batch de instructiuni pentru utiltarele SQL. Server. Sintaxa: co Observati 1 GO-nu este o instructiune, ci este o comanda recunoscutt de cétre SQL Server. Query Analyzer si de alte utilitare. Batch-ul curent Je instructiuni consti din toate instructiunile de la ultimul GO sau de la Inceputul sesiunii ad-hoc daca acesta este primul GO. 2. O instructiune nu poate ocupa aceeasi linie cu © comand’ GO. Totus linia cu 0 comand’ GO poate contine comentari, Domeniul variabilelor locale (definite de cate utilizator) este limitat {a batch-ul eurent, nici una dintre acestea nu poate fi referith dupt comanda GO. Aplicatiile pot trimite mai multe instructiuni la SQL Server pentru a fi recutate 2 un batch. Instructiunile dintr-un batch sunt compilate intt-un n-Line pot lansa fn executie instructiuni ad t construi scripturi de instructiuni care si In toate aceste cazuti se poate folosi ful unui batch, Comanda GO este adresata Jn aceagi batch pot reunite mai multe instuctiuni CREATE TABLE, {n Schimb, pentru orice instructiune CREATE VIEW sau CREATE PROCEDURE este nevoic de cite un batch separat: (CREXTE TABLE 11 (« Sint) CREATE TABLE 92 (x dnt) CREATE PROCEDURE Showet AS SBubCT * PROM TT 0 CREATE ViEW vE2_AS SELECT * FROM 12 0 variabila creata intr-un batch nu poate fi referitt tn alt batch chiar dact este 0 variabila de tip tabel: DECLARE dx TASLE(a mF) INSERT @x_VALUES(1) 0 INSERT @x VALUES(2) — —eoaevuribitanedeclaata 4.9. Exercitii si probleme SA se rescrie secventa de mai jos far a folosi RETURN gi folosind o singuri instructiune IF: IP No? EXISTS (SELECT * FROM Eunizor) RETURN TP NOT BXESTS (SELECT * ¥ROM Produs) REDURN IP WoT BKISTS (SELECT * FROM Oferte) RETURN SELECT Furnizor Mune, Frodus Nunc, Pret, cantitate ROW Purnizer,Oferte, Prous WHERE Purnizor .codP-Oferte cod? AND Oferte.CoaP=Produs .CodP Si se rescrie secventa de Ia exercifiul 1), astfel inedt si se afigeze efite tun mesaj (prin instructiunea PRINT. 'Tabela este vidal"), pentru oricare dintre cele trei tabele Furnizor, Oferte sau Produs care nu confine nici o tuplt. 3. In seeventa de mai jos complectai fecare mesaj "Tabeta vida cw nnumele tabelei la care se refer’ mesajul: IP EXISTS (SEUECP * PROM Furnizor} TP EXISTS (SELECT + FROM Prods) SELECT Purnizor.nune, Produs Mune, Pret,Cantitate PROM Purnizor, Oferte, Produs, WHERE Furnizor.CodP=dterte Cod? AND Oferte.CodP=Produs. Cod? a1 4 2 PRIVT ‘Tabela vida! suse PRINT “tabela vida! Si se rescrie urmitoarea secvenft folosind instruetiunea WHILE si evitind instructinnen GOT Test_secunda TP(DATEPART (ss, GeTOATE()} <0) BEGIN WAITFOR DELAY *00;00:02" COTO Test!_secunda, a PRINT DATEPARD (nm, GEPDATE() ) Care dintre secvenfele de mai jos sunt corecte din punctul de vedere al grapAri instructiunilor in batch-uri si care nu? Corectafi secyen. {ele gresite forménd mai multe batch-uri dacd este nevoie! 4. CREATE TABLE hia int} D. CREATE TABLE Tifa int) CREATE TABLE 12m int) SELECT * PROM 'T2 © CREATE TABLE Tifa int) d. CREATE View VII Ag SELECT * FROMT1 + -REATE TABLE T1(a int) CREATE TABLE 72(a int) ©. CREATE TABLE T1{a int} co CREATE VIEW VE Ag SELECT * FROM TL SELECT * FROM Vnl 5. SINTAXA FRAZEI SELECT IN SQL SERVER Fraza SELECT este principalul instrument pentru regisirea datelor dinte-o baz de date relational. Permite selectarea a una sau mai multe tuple silsauatribute din una sau mei multe tabele dup& eriteri din cele mai diverse complexe. Sintaxa complet a frazei SELECT este destul de complexs, dar Principalele clauze se pot sintetiza asf: SELECT lista select [INTO tabela_nowa} FROM lista_relani [WBERE condltie de_cautare) [GROUP BY expresie_de_gripare [HAVING conditie. de-select grup}) (ORDER BY expresie_de_ordonare [ASC | DESC) ] fn SQL Server se poste folosi operatorul de reuniune (UNION) pentru fa reuni rezultaicle a mai multe fraze SELECT int-o singura relatie rezltat Operatorii pentru diferenta (MINUS) si intersecfia (INTERSECT) a dout ‘multimi de tuple nu sunt implementati in SQL Server. {In cele de mai jos vor prezenta cele mai importante elemente de sintaxt entra fieeate dintre clauzele frazei SELECT. Din cauza complexitai sintaxei fu ne propuinem o prezentare exhaustiv8, ci vom lisa la o parte elementele mai Putin utiizate sau cele care ar putea suri modifictri de la o versiune la alta a SQL Server. Pentru sintaxa complet recomandim utilizarea documentatilor de sistem, 5.1, Clauza SELECT Specificd atributele relatiei rezultat Sintaxa: SELECT [ ALL | DISTINCT ] [ TOP x (PERCENT) ( WITH TIES} ) tt 1 {rune tabel Imume_vedere alias tabel }# | {nume_coloana | expresie | DENTITYCOL |ROWGUIDCOL } LIAS} alias_coleana} | alias_coloma expresie Von) ‘unde semnificatia diferitelor optiuni este urmatoarea: 86 vunde; = UINNER |( ( LEFT RIGHT FULL } [OUTER] } ) JOIN “ - specifica tabele, vederi, faze SELECT si tabele cuplate ‘are constituie sursa de tuple pentru fraza SELECT. ‘ume tabet{[AS) alias sabe! }-specifick numele uneitabele gi un alias optional view.name [ (AS) alias_tabel ]- specifica numele unei vederi si un alias optional. Faeiie_reltie{ [AS] alias tabel | - specifct numele unei funeti care Fetureazi o refering la un set de tuple (relafie) si un alias optional, ‘rata SELECT | (AS) alias_tabel | este 0 frazk SELECT imbricata, ‘alias.coloana - este wn alias optional pentru a redenumi coloanele ‘elajii returnate de o frazi SELECT imbricata ‘<‘abele_cuplate > - este 0 relate obtinuta prin cuplarea a dowd sau mai multe tabele CROSS JOIN - specific& produsul cartezian a doua tabele. <1p_cuplare > - specific tipul operajei de cuplare. Acesta poate fi * INNER - specifics faptul ca toate perechile care se cag prin conditia de cuplare si numai acestea fae parte din relatia rezultat, * LEFT [OUTER] - specifica faptul cf toate tuplele din {pbela stinga care na satisfac conditia de cuplare se includ tn relafia rezultat alaturi de cele care satising © FULL [OUTER] ] - specifica faptul c& toate tuplale din ambele tabele care nu satisfac conditia de euplare se includ in relatia rezultat alaturi de cele care sate aceasté conditie, Coloanele corespunzatoare celeilalte tabele se seteaz la valoarea NULL in toate acest tuple. * JOIN - este operatorul generic de cuplare, ON < conditie_cautare > - specific& conditia de cuplare. in general, cconditia de cuplare poate specifica orice predicat, cel mai ‘desea exprimat sub forma unor comparafii intre atribute, Comparatia atributelor se poate face intre atribute de acelagi tip sau fntre atribute avand tipuri compatibile, eaz in care SQL Server face o conversie implicitd. Daca nu este posibil conversia implicit, atunei se pot folosi functile de conversie expliciti (CAST sau CONVERT) pentru a aduce atributele ‘omparate la acelagi tip de dats, O conditie de cautare este o combinatie de douai sau mai multe predicate prin operatorii logici AND, OR si NOT. Sintaxa unei condifi de cdutare este: = (NOT } | (< conditie_cautare >) } [ {AND OR} [NOT] { |< conditie_cautare >) )} Vben} unde predicat este o expresie care returneazé una din valorile TRUE, FALSE ori UNKNOWN. Sintaxa simplificata a unui predicat este urmatoarea: := ¢ expresie [=1 Nal >| >=1 I> I< lenl le expresie lexpresie_sir (NOT] LIKE exprecie_sir lespresie [NOT] BETWEEN espresie AND expresie lespresie IS [NOT] NULL \espresie [NOT] IN (subinterogare lexpresie[,.n]) lexpresie | = |< |!=1>1>=11 l - are acecasi semnificatie ca si in cazul clauzei FROM. ificd un interval inchis de valori (inclusiy 5.5. Clauza GROUP BY Specifica grupurile care se formeazi din tuplele selectate prin clauzele jntcrioare, Blementcle din clauza SELECT trebuie s& produc& o Valoare unicd 5.6. Clauza HAVING Specificd o conditie de cdutare a nivelut grupurilor. Clauza HAVING Poate fi flosita numa ta prezenta clauzei GROUP BY. Sintaxa: [HAVING < conditie_cautare > | unde: ‘ ~ specifica conditia de cdutare pentru grupurile de tuple, f 89 Conditia de cautare este similaré ca sintaxat eu cole de la clauzele FROM si WHERE cu mentiunes ci este exprimata doar in fermenii acelor clemente care au o valoare unict la nivel de grup. Dack se foloseste HAVING impreunt ca GROUP BY ALL. tunel clauza HAVING are prioritate gi anulenza efectul optiunil ALL. Tipurile de date text, image 51 ntext nu se pot folosi intt-0 clauzi HAVING, 5.7. Operatorul UNION Combing rezultatele a dows sau mai multe interogiri inte-o sin wulte interogiri intr-o singura relafie rezuktat care confine toate tuplele din interogirile iniiale. Relatile combinate prin UNION trebuie si satisfact conditia de compatibilitate la reuniune, ceea ce inseamni ca: ‘humiial si ordinea coloanelor trebuie si fie aceeasi in toate relatile; * Spurl de date ale coloanetor corespondente trebue si fie compa. tibil, Sintaxa: { ) UNION [ALL] (UNION [ALL] tan unde: “nterogare> ~ este 0 introgare care returench 0 elie rena pet af combina co alt vlc Tense sot seeeyi struct, Colomel corepondent ds ea, reunite trebul 8 fie compatible prin cores implicit se SQL Server, UNION - specific combinarea prin reuniune a doud sau mai multe relaii, ALL ~ Incorporeazs toate tuplele tn rezultat, inclusiv dupli- cal, Dac nu se specifies opines ALL pecs ‘sunt automat eliminate, ean 90 5.8. Clauza ORDER BY Specifica operatia de sortare a relafici rezultat. Clauza ORDER BY nu poate 8B apard tn subinterogari sau in definitile de vederl Sintaxa: [ORDER BY (expresie_ordonare [ ASC DESC] } [5.2] ] unde: expresie_ordonare - specific 0 coloant pe baza clreia se face sortarea, Poate fi un nume sau alias de coloand, o expresie sau un intreg pozitiv reprezentind pozitia criteriului de sortare In lista clauzei SELECT. ‘Se pot specifica mai multe coloane in acecasi clauzi ORDER BY pentru a forma o secvent ierarhicd cu criteriu de sortare primar, secundar, tertiar s.a.md. ‘Clauza ORDER BY poste s& includ gi crterit de sortare care nu apar fn lista clauzei SELECT; totusi, daca se foloseste SELECT DISTINCT sau dacit fraza SELECT confine operatorul UNION, atunci toate criterile de sortare trebuie s& aparé in list, SELECT. Mai mult, dack fraza SELECT include operatorul UNION, criterile de sortare trebuie s& aiba aceleasi nume cu cele din lista clauzei SELECT a primei interogari. Tipurile de data ntext, text si image nu se pot folosi ca gicriterii de sortare, ASC - specified ordonare crescatoare. DESC - specifica ordonare descrescatoare. Valorile NULL sunt considerate ca cele mai mici valori posibile si vor apare primele intr-o ordonare crescitoare, Observat 1. Ordinea clauzelor intr-o frazt SELECT este semnificativa. Oricare Bumirasts') Jn interogarea de mai sus, fraza SELECT imibricaté returneaza codurile furnizorilor care au cel pusin un beneficiar fn alt oray dectt Bucurest. ‘Rezultatul dorit se obtine prin seletia acelorfurnizori din Cluj care au 104 cel putin: un beneficiar in Bucuresti si nu fae parte din multimea fumnizorilor cu beneficiari din alt oras decét Bucuresti Urmatoarele doua exemple ilustreaza faptul ca operatorul IN, in varianta 814 negatie, se poate inlocui prin operatii de cuplare, atunci cdad membrul rept (set_de_valori) se obtine dintr-o frazd SELECT. 16. "Numele furnizorilor care livreazé mai mult de un singur produs?* Varian SELECT mano PROM Furnizor WHERE Col Im (seLecr Coa ROW ‘ranenctii WHERE Coa TH (SELECT codr FROM Pranzactsi WHERE Cod? <> T.coap)) Vartan: SELECT mane FROM Furnizor WHERE Coa IN (SELECT T1.coaP FROM Tranzectii T1,Traneactii 12 WHERE T1.CodF="2.coa? AND T1.CodP>2.CodP) Verona FROM Furnizor, Tranactis ™1,trancactit 72 WHERE: Purnizor .Codre 1 CodF BND Tl. CodPet2, cor axp ™1 coapcot? .codP 11, "Numele furnizorilor care au cel pusin doi beneficiari Varian SELECT sume PROM Furnizor WHERE CoaF 1 (SELECT Coar FROM Tranzactil 7 (SELECT Coa ‘WHERE Codi<>'?.Coas) ) 105 Varian 2: SELECT Mame FROM Furnizor WHERE CodF IN (SotEcT t1.coaP WHERE T1.codr=t2.codr AND TL.CodBe>"2..coas) Varina 3 SELECT DISTINCT Meme FROM Purnfzor, Tranzactsi T1,Trenzactii 72 ‘WHERE Forni zor.codF= "1 -cod?” ‘AND T1.CodP=¥2..Codr AND Ti code? cop 6.4. Folosirea operatorului EXISTS Operatorul EXISTS se aplick unei fraze SELECT pentru a consirui 0 ‘expresic de tip boolean care poate fi folositl fn clauza WHERE a unei alte fraze SELECT, dar sn cadrul unor intructiuni IF ori m expresti CASE Sintaxa este de forma: [NOT] EXISTS (raza SELECT) rezultatul evaluarii expresiei find TRUE dac& fraza SELECT, data ca ‘argument, retumeaza cel putin o tupa i FALSE fn onz conta. in multe cazuri,o interogare care foloseste forma negatl a operatorului IN (NOTIN) se ponte Tnlocuiprint-o alta, asemindtoare, dar cae foloseste operatorul EXISTS tot fn forma negaté (NOT EXISTS), Umnitoarle doa xemple sunt rescriei ale interogiilor 14) si 15) care sustreazt acest aspect 18. "Numele furnizorilor care nu oferd nici calculatoare, SELECT Nune FROM Furnizor F WHERE NOT Exists(seLEcr + ‘PROM Oferta, Produs WHERE oferte.c nici automobile?” calculatoare! OR Produs.Mume=" Automobile") AND P.Coaesoferte.coaP) 19, “Mumelefrmieorlor din Ch care a benefctari mura Bucuresti? SELECT DISTINET F.Wune PROM Fumnizor F,Trenzacti,Reneficiar WHERE P.CodF=Tranzactii cod ‘AND Transactis.cods=Baneficlar.codn AND Furnizor.oras= AND Baneficiar Oras: AND SOT EXISTS(SELECT * . FROM Tranzactii, Beneficiar WHERE ‘tranzactii.CodB=Beneficiar.coas AND F.CodF=Coa AND Beneficlar.orase' Bucuresti") ‘Observatie: {In general, aperatorul IN este considerat ca fiind lent fn varianta cand membrul su drept este 0 frazi SELECT. Din acest motiv se prefer {nlocuirea operatorului IN prin operatii de cuplare, iar a variantei negate, NOT IN, prin operatorul NOT EXISTS, oti de cdte ori acest lucru este posibil 20. "Numele furnizoritor care au ca beneficiari pe toti beneficiarit din Bucuresti?” fn sistemele in care operatorl IN funfioneaa si ca operator de inchi- diane ttre dovd mulfini de tuple, solutia comodA penta interogarea de taal sus este: FROM Purnizor F (SELECR cos ‘FROM Reneficiar WHERE Oras = "Bucurest*) (SELECT Coan FROM ‘Tranzactit WHERE ¥-CodP=CoaP) care retureaza numelefurnizacilor cu proprietatea ct multimeatuturor beneficiacilor din Bucuresti este inclusé jn mmulfimea beneficarlor fiecdrui furnizor din rezultat (vezi variabila de tupli F, referith fn al doilea membra al operatoruui IN, prin cae se retumeazi codurle de beneficiar pentru furnizorl curent din rezultat). Din plcatesolutin de ‘ai sus mu este aeceptata in standardul SQL "92 care gore ca membrat stag al operatoruui IN sA fe un scalar ori otupl, dar nu multime de tuple. fp aceste conitéimterogarea se ponte rezalva falocind opertoeul MINUS in combinatie cu NOT EXISTS: se vor returna numele acelor furnizori cu propretatea c8 nu exist nici un benefciar in Bucuret care ‘sd nu fie printre beneficiarii oricarui furnizor din rezultat. SELECT Mune PRON Furnizor P wise Gor Rita83) ((SELECP Coa WHERE Oras = "Bucuresti*) IA Gang) (SELECr cogs THOM ‘ranzact i ‘ieee #:Codr (transact). coap) Nici aceasta din urma solic mu este eceptat in SQL Server care na ae implement operatorl MINUS, Avestnejuns poste ehininat pa folositea repeats a operatoruiei NOT EXISTS, lgien resolute fied urmatoarea: retummeazd.numele furnizorul dac8 na. exist net on beneficir din Bucuresti care sf nu fie i beneicat a urmmoeula curent ssua0t Mune ret Porntsor F tnisne for mxtors\setece @ ‘tena Ores =. bucurests ‘No Nor Exists SEuReh + Tom Teansactit tiene Fodretranzacett coat ‘00 Sransactil Codbss_Cous)) Solutia de mai sus este compatibilé SQL Server si este acceptatt de orice sistem compatibil cu standardul SQL ‘92. Solutia precedentd, bazati pe folosirea operatorului MINUS este acceptati doar de sistemele care implementeaza complet standardol SQL'92 cum sunt cele din familia ORACLE, Pentru cxemplele urmitoare de acelagi tip prezentim doar varianta de solutie compatibila cu SQL Server. ai. “108 “Numele furnizorilor care oferd toate tipurile de produse?™ SELECT Name FROM Purnizor P WHERE NOT EXIeTS (seuzen + FROM Produs P WHERE Not Exists (SELECT + PROM Oferte: MERE F-CodP= oferte.cocr [AND CoaP=P,Cod?)) 2, 23, 24, Observati “Numele furnizorilor care au beneficiari th toate orasele? SELECT mune PROM Furnizor F WHERE NO? Extens (seLecr * FROM Beneficiar 3 WHERE NOT EXISTS (SELECT * FROM Tranzact<, Benefictar WHERE Tranzacts{.CodR-Beneficiar code AND Cod=F cour AND Bene#icLar.orae. -0ras)) "Numele furnizorilor care au livrat toate tipurile de produse si au tranzacfi eu top! beneficiarii?” SELECT Nana PROM Furntzor F WHERE NOT EXISTS (SELECT * FROM Prous P WHERE NOT EXISTS (SELECT * FROM Tranzactis WHERE CoaP=F Coa? AND CoaP=P-CoaP)} NOP Exrsrs (SELECT + FROM Beneficiar B NOERE NOT EXISTS (SELECT * PROM ‘Tranzactit WHERE CodP=P .Cogr AND Coda=.cods }) “Numele furnizorilor care au livrat toate tipurile de produse fiectirui beneficiar?™ seuacr mae Fat Furaitor ¥ ne WOT axsTs (SELECT * ve FROM Produs P,Beneficiar B ‘aud wor easers (SELECT + rel Hranseorit fans Courercoae ND GoapeP.coap TaD ‘Codb-b.cooB |) cet es on ci et pot cr eae posit de produ-beneficiar (vezi prodsul cartesian cin faza SELECT inbricatt pe prinul nivel!) sf existe 0 tanzacfic corespun- ‘Alou a fuizorull ect © 6.5. Exercitii si probleme L no Si se rezolve in limbajul SQL urmatoarele interogiri: a, "Numele beneficiarilor din Bucuresti?” b b. "Numele beneficiarilor care nu sunt din Cluj sau Bucuresti?" & "Numele produselor pentru care sa inchelat cel. putin o tranzacfie?" 4. "Nomele beneficiarilor din Bucuresti care au cumpirat calculatoare?’ €"Numele beneficiarilor care au cereri de calculatoare?" £. "Numele beneficiarilor care au cereri de calculatoare si ep automobile?" & "Numole beneficiarilor care nu au nici o cerere?* h, "Namele beneficlarilor eare nn au cereri de caleulatoare si nit ‘de automobile?” “"Namele beneficlarilor care in cumpiirat cel putin doud tipuri de produse? i "Numele beneticiaritor care au cereri pentru toate tipurite de produse?" k. "Numele benefictaritor care au cereri pentru toate tipurile de caleulatoare si autoturisme’”™ 1. "Numele beneficiarilor care nu au cerert pentru toate tipurile de produse?" m. "Numele beneficiarilor care au cumparat toate tipurile de roduse pentru care au cereri?” SK ‘se reserie in variant compatibili. SQL Server urmitoarele interogiris - (SELECT Furnizor mune FROM Purnizor,Teanzactil,teneficiar WHERE Furnizor.codP=tranzactii.coar Aub ranract1i .codseaeneficlar Coda aND Beneficiar Oraes"Bucuresti*| “urensect (SELECT Furnizor. thane FROM Purnizor,Trengactii,nenefictar inten, Pumizor.coaP-Pranzactss Coa? “ AND Tranzactii .CodB-Beneficiar Cod IND Benefdeine Oras="cle)") Row Furnisor tranaactii, Seneficiar raiser ,Codrstranzect coal WHERe Nop Transact. codsetenefclar Col IND Seneficiar.oraee"Bucurerts") vans ie (smutcr Pumizor.More ron rurntror Seanactit, Senet sesae ne, Furpisot Coaretranzactsi Coa? am AND Tranzactii.CodBeBeneficiar.CodB BO Beneflcias oraen"cha5) SELECT mune FROM Furnizor F WHERE (seuscr coaP FROM Proaus) m (SELECT coae FROM Oferte WaERE ¥Coa m4 7. FORMULAREA INTEROGARILOR IN LIMBAJUL SQL (PARTEA A II-A) 7.1. Folosirea clauzelor GROUP BY si HAVING Inlerogirle ce urmenzA ilustreazt modul de folosire al claveclor GROUP BY 3i HAVING. De refinut c& tro claust SELECT et interogisi cu GROUP BY pot s& apari doar caracteristic! unice ae rup, ce in SQL Server inseamnna strict c, ca $i cfectiv la grupare; ‘pa cod furnizor, mumele furnizor este tot SEL Bea a uid de grup. Daca se doreste includerea acestora in lista clauze! SELECT, atunci aceste atribute trebuie incluse $i pr Finbar, chiar daci aceasta nu va modifica configuatia grupurilor. Acelasi lucru trebuie ficut daca se doreste folosrea unui asemecnea atibut in cine HAVING. Pei sruparea este, in principiu, © operate coststoar, ea se dovedeste 4 61, de multe ori, o solutie mai eficienta decat eventualele alternative ene ny folosese. gruparea, dar recurg Ia fraze SELECT imbricate. La uncle dinwe Szemplele ce urmeara sunt artate solu posiile care nu folosese gruparea gi Sunt mai lente decat solupile echivalente bazate pe grupare. J. "Numete oraselor $i mumarul de furnizori din fiecare oras?” SELECT Oras, coun (code) PROK Furnizor GROUP BY Oras 2 "Lista oraselor in care sunt cel pun cinci furnizori?® SEUBCT oraa PRON Purnizor GROUP BY Oras HAVING Count (code) >—5 “Numele orazelor si numdrul de furnizori pentru primele 10 orase in ordinea descrescatoare a numérului de furnizori?" SELECT TOP 10 Oras, comnm(coas) FROM Furnizor GROUP BY Oras ORDER BY COUNT(Coae) BRSC fumdirul de oferte facute de fiecare furnizor (se va refine numele farnizorutui si numérul ofenelor)?” SELECT ‘ume, COUNP Cod?) FROM Purnizor,oferte WAERE Furni zor .CodP-oferte.coaP GROUP BY Mune “Numele beneficiarilor care au incheiat tranzacyil in valoare totalé de peste un milion?” SELECT ome FROM Beneficiar,Transactii WHERE Tranzactii Codi=Beneficiar.coda GROUP BY mune HAVING suxt(Cantitate*Pret)>1000000 cde we tec in wna ae aa foe rain mtopaes Ba pope ose ek Sa imei aoe eee et idbiactieen Dee a a it vg Ft ae seein lenge GROUP 1 cl ifonat calewatoare in Namele beneiciarilr din Clu) care au acho valoare de pest un milion de la furnizor din Bucurest? SET teeter me ae itians, rurnizor.courctrencaceit Coa? AND feanzectid. Ce 14 AND senofictar.oras='Cluj ‘AND Produs.Mume= "Calculator GROUP BY Beneficiar. tune HAVING Sum (cantitate*Pret) +1000000 “Lista perechilor furnizor-beneficiar care au incheiat cel pusin 10 tranaacyir?” SELECT Furnizor.Mume, BeneFiciar..tume Frou Furnizor,Tranzactii, Beneficiar wane Fornizor CodP-Tranzsetit -CodP AND Tranzectii.CodB-Benef iciay. CosB Rov? BY Furnizor. mune, Beneficier.thme HAVEING couNT(Tranzact!i,cod®)>=10 “Lista perechilor furnizor-beneficiar care nu au incheiat thire ei nici 0 trancactie?" Pornind de la interogarea precedenta, din punct de vedere logic, aceasti imterogare se poate refomula astfel: cea ce ar sugera 0 solutie derivata din solutia interog: care conditia: ‘count (tranzactii coat) >=10 se schimb& cu: courr(rranzactss .coat) Rezultatul returnat de fraza SELECT astfel obtinutt va retumna invariabil o relatie firé nici o tupla deoarece fn relafia Tranzacfii apar ppetechile de coduri furnizor-beneficiar numai pentru cei care au incheiat el putin o tranzacto tntre ei, iar cei fra tranzactii (eu O tranzactii) mu apat in tabela Tranzacti, Variantele de mai jos rezolva inerogarea fark a folosi gruparea. Poate fi dezvoltatt si 0 solutie care foloseste gruparea, ornind de ta idea de mai sus, dat presupune folosicea operatorilor de cuplare RIGHT JOIN si CROSS JOIN (vezi capitolul 8, operatori de ccuplare extern Variant 5 (firs GROUP BY sft eperuorat COUNT) FROM Furnizer P/Beneticsar p WHERE No? EXISTS (setece + ROW Tranzactii WHERE Coa?=P-coar [AND CodB-B, Cod} Varianta 2 (firs GROUP BY, flosnd operatoral COUNT]: SELECT F.sume,..une ROM Furaizor P)Beneficiar B ‘WHERE (SELECT COUMT(*) FROM Tranzactit WHERE CodP=P.Cod? r ‘AND CodB-B.Cod)=0 Variant 3 (sole compatbila SOL."2, dar ncompatibll SQL Server): ‘geuacn Purnizor.tune,Doneficiar.None FROM Furnizor, Geneficiar (HERE (CodB,Cod#) NOT IN (SELECT DISTINCT CoaB,Cod® ‘FROM Tranzactsi) Observatie: fin mod clar, Variantal de mai sus este mai eficientt decit Varianta2 ‘Aceasta se datoreazA faptului c& operatorul EXISTS este bine optimizat in SQL Server si in toate cazurile este de preferat unei constructii de forma: {SELECT COUNT(+) = Varianta3 mu este aoceptata de SQL Server deoarece operatorul IN ( NOT IN) nu accept ca membru sting o listi de valori, ci numai expresii care retuneaza o singura valoate. 9. “Lista perechilor furnizor-beneficiar, impreuni cu mumdirul de trancactit ‘Incheiate tntre cei doi?" SELECT Furntzor.Nune, Boneficiar Mune, cOUNT(*) ‘FROM Furnizor,tranzactii, Beneficiar Wane Purnizor.codr=Tranzacts .code AND Tranzactil .codp-Beneficiar-coda GROUP BY Furnizor Mune, Beneficiar-Nune 10. “Lista perechilor furnizor-beneficiar, impreunii cu media valorié tranzactiilor incheiate intre cei doi?” SELECT Furntzor.Nune, Reneficiar.mue,AVG(Cantitate*Pret) FROM Furnizor,Tranzactii, Beneficiar WHERE Furnizor .CodP=Tranzactil Cod? AND ‘ranzactii .Coas=Beneficiar. Coda ‘GROUP BY Purnizor .Nune, Beneficiar Mune of “Lista pereckilor furnizor-bene din Bucuresti cu media vatorii tranzactilor peste 10000?" SELECT Furnizor.Mme, Reneficiar ‘une ROM Furnizor, teanzactii, Beneficine WHERE Purnizor .codP=Tranzaceii Cour ano tranzactid coats AND Purnizor,Orass'cluy aN deneficiar.Oras='Ducuresti* GROUP BY Purnizor.Mune, Benefielay «Sune HAVING AUG (cantitate*Pret) 210000 sista perechilor de orare astfel inca in al doilea orag sd existe cel Putin 10 beneficiari care au cel puin un furnizor i primut ora?” SELECT DISTINCT Purntzor.oras,teneficiar .ores FROW Purnizor,tranzactii, Beneficiar WHERE Furnizor CodP=tranzecti.Coa aND Tranzactii..coas-beneticiarCoeB GROUP BY rurnizor.oras,seneficiar Orae Havins coun (DistINeT Geneficiar -codp)>=10 pitta perechilor de orase asfel ind ta primal oray sé existe cel pujin tun furnizor care sa alba cel pusin 10 beneficiari din al doilea oras?™ SELECT DISTINCT Furnizer.oras, neneficlar.oraa HOM Purnizor, Tranzactii, Beneficiar WHERE Purnizor.codr=nranzactii -Codr AND Trenzactii.Codieeneticler-codB Group BY Purnizor.codr,Furnizor Ores, Beneficiaroras Wiaviwe cour (orstimcr Seneticiac.cods) set Pentru a objine rezultatul dort este necesar s8 forma grupuri astfel Theft fiecare grup s4 contins beneficiari cBte unui furnizor 31 dintun Mgor oras beneficiar. De aici rezult ca i citerii de grupare atributcle Fumizor.CodF si Beneficiar Oras. Totusi, reaultatol trebuie s4 conting valorile atributului Furnicor.Ovas ceea ce inseamna c& si acesta trebuie {clus printe atributele de grupare. De remarcat c& acest atribut mu Influenfeaza modal de formaze al grupurlor deoarece int-un. grup format dupt Furnizor.CodF nu pot exista dous valori diferte pentra Purnizor.Oras. Optiunea DISTINCT din clauza SELECT este necesata Pentru ci o pereche de orage care satisface conditle eerute va fi Selectatd pentru ficcare furnizor existent in oragul furnizor zorespun. itor. In funcjia de agregare COUNT, optiunen DISTINCT ne eficiar cu furnizor din Cluj st beneficiar necesara pentru c& un grup poate contine mai multe tuple (dupa céte tranzactii are cu furnizoral curent!) pentru acelagi beneficiar 14 "Cea mat bund oferta pentru fiecare tip de produs (se va retine numele produsului si preful ofertei)?" SELECT Mune, MIN (Pret) PROM Oferte, Proaus WHERE Oferte.codP=Produs,code GROUP BY Nuns 15. "Cea mai bund ofertd pentra fiecare produs si furnizorul care a flcut oferta (se va retine numele furnizorului, numele produsului si prepul ofertei)?" Aceastl interogare, fn ciuda asemiintrii cu precedenta, nu se rezolvi la fel de usor din cauza cerinfei de a avea in rezultat numele furnizorului ‘care a ficut cea mai bund oferta pentcu un produs dat. Aceasta elimini posiblitatea unei grupatidirecte fn vederea aplictrii fumetiel de agregare MIN asupra atributului pret Ia nivetul flecirui grup, deoarece ar impune {gruparea gi dupa numele furnizor ceea ce nu corespunde cu rezultatal dort. Prezentim 3 variante diferite de rezolvare dintre care doar ultima apeleazi Ja grupare. Verna SELECT P.Mune,Oferte. Pret, Purnizor Mune FRow furnizor,Oferte, Produs.P WHERE Furnizor.coaP-Oterte.Cod? AND Oferta. Cod?=P. Coa? AND Oferte.Prat } [,..n]] UWHERE | 1( (CURRENT OF (ULGLOBAL } nume_cursor} | nume_variabila_cursor) i) FROM - cuviint cheie optional care precede numele tabelei din care se face stergerea, ‘nume_tabela - este numele tabelei din care se face stergerea. ‘nume_vedere - este numele unei vederi actualizabile din care se face stergerea findind cont de restrictile referitoare la actualizarile vederilor. FROM < sursa_tabela > - este 0 clauzd FROM aditional8. Aceasta este © extensie specific SQL Server si inexistent tn standardul ‘SQL"92, Prin aceasta extensie se poate specifica o cuplare de mai mule tabele care se poste folosi in locul unei fraze SELECT care si fie imbricatt fa cluza WHERE a instuo- fiunii DELETE. Accastt extensie poate contine tabele, veder, Seturi rezultat objinute din fraze SELECT imbricate, eft $i toate tipurile acceptate de operat de cuplare (LEFT JOIN, RIGHT JOIN, FULL JOIN etc) WHERE -spciet condi prin ere iene tuples de srs. lipsa une clauze WHERE se sterg toate tupele din abi 137 Observay 138 Existtidoua forme de operati de stergere: ‘+ Stergere cu cdutare - se specifics o conditie de c&utare pentru tuplele de gtrs. + Stergere pozitionata ~ se foloseste clauza CURRENT OF Pentru a specifica un cursor, iar stergerea se referd la tupla, aflata la pozitia curenta a cursorului. Acest mod de stergere permite eliminarea dintr-o tabel& doar a uneia dintré mai rulte tuple ide < conditie_cautare > - orice conditie de ciutare acceptath fotr-o clauzs WHERE, CURRENT OF - specifica stergerea tuplei de la pozitia curent’ a cursorului specificat, GLOBAL - specifics faptul c& nume_cursor se refer la un cursor global ‘nume_cursor ~ este numele unui cursor deschis care trebuie s& permit operatii de actualizare, Daca existl att un cursor global, edt i lunul local cu acelasi nume, atunci nume_cursor se refer’ la cursorul global dac& se specific& optiunea GLOBAL gi la cel local fn eaz contrar nume_variabila_cursor - este numele unei variabile cursor, care se referd Ja un cursor deschis si actualizabil |. Instructiunea DELETE esueaza daca se Mncearca stegerea unei tuple care este referitt dint alti tabeld printr-o constrigere de tip FOREIGN KEY. Daca operatia DELETE se referi la mai multe tuple si una dintre ele violeazi o constrangere, atunei inreaga ope ‘atic este anulata, se afigeaz& un mesaj de eroare gi nu se sterge nici o ‘upla. 2. Dact se doreste stergerea tuturor tuplelor dintr-o tabela, instructiunea TRUNCATE TABLE este mai rapid decét DELETE. DELETE elimina tuplele fizic, una cate una si fnregistreaza in jumnal fiecare {upli climinata. TRUNCATE TABLE realizeaza dealocarea tuturor Paginilor de date asociate unui tabel si consumi mai putin spatiu tn Jumal. Din punct de vedere functional, TRUNCATE TABLE este echivalent cu DELETE fira clauzi WHERE, dar TRUNCATE. TABLE nu se poate aplica tabelelor referite prin contringeri de FOREIGN KEY chiar daca datele din tabela nu sunt referte de datele din tabela de referinga. (De exemplu nu se poate sterge tabela Furnizor prin TRUNCATE TABLE nici macar atunci cand tabelele Oferte.si Tranzactit sunt vide.) Exemple: 1. Stergerea tuturor tranzactitlor: DELETE Tranzacts 2 Stergerea furnizorilor din Clay DELETE Furnizor WHERE Oras = ‘Cluj’ 3. Stergerea ofertelor de calcularoare: Variant compari cu standard! SOL'92 WHERE CoaP im (SELECT Cod? FROM Produs WERE wWune- 'Calculator'} Vorianta ew exensa SQL Server DELETE oferte FROM Oferte, Prous WHERE Oferte.CodP=Produs .coa? AND Mune='Calewlator 9.2.3. Instructiunea UPDATE Modifica date existente intr-o tabel Sintaxa (simplificata); UPDATE (nume_tabela |nume_vedere) SET { nume_coloana = { expresie DEFAULT | NULL ) | @variabila = expresie | @variabila = coloana = expresie | { un] [FROM { } { ,..0]] [WHERE ( < conditie cautare> I [CURRENT OF C1 [GLOBAL | mume_cursor} |nume_varabila_cersor) n 1 139 nume_tabela - este numele tabelei in care se face modificarea, mume_vedere - este numele unei vederi actualizabile In care se face ‘modificarea tindnd cont de restrictile referitoare fa actualizar vederilor. SET - specific lista de coloane sau nume de veriabils ce se modifica. rniome_coloana - este numele unei coloane care se modified. Coloanele de tip IDENTITY nu se pot modifica. expresie - este o variabilt, literal, expresie sau instructiome SELECT Inchisd inte paranteze returndnd o valoare unics. DEFAULT - valoarea implicits definits pentru cotoana specificata va {nlocui valoarea existenté. Dac& coloana accept valori NULL simu are definta o valoare implicit, atunct valoarea eAmpului va fi NULL. @variabita - este o variabilé declarats in prealabil care va Ina valoarea rezultata din evaluarea lui expresie. SET @variabila = coloana = expresie - seteazA variabila specificata la noua valoare a coloanei. Acesta diferi de constructia, SET @variabila = coloana, coloana = expresie, prin care variabila este setata la valoarea veche a coloanei. OM < sursa_tabela > - este 0 clauzh FROM aditionald. Este 0 | extensie specified SQL Server gi permite aceleasi facilitati ca $i clauza FROM din instructiunea DELETE. - specifick conditiile prin care se identifica tuplele de ‘modificat. In lipsa unei elauze WHERE se modifics toate Auplele din tabeld. Exist dou forme de operafi de actualizare: + Actualizare cu catutare - se specific’ o conditie de cautare pentru tuplele de modifica "+ Actualizaré positionata - se foloseste clauza CURRENT ‘OF pentru a specifica un cursor, iar actualizarea se refer a tupla aflata Ia pozitia curenti a cursorului, Acest tip de ‘ctualizare permite schimbarea valorilor doar pentru una intre mai multe tuple identice, ondite_cautare > - orice condijie de cSutare acceptatS nto clauzh WHERE. CURRENT OF - specifict actualizarea tuplei de ta pozitia curenta a ‘cursorului specificat GLOBAL’ specified faptul 8 nume_cwrsor se refer Ia un cursor sloba. nume_cursor - este numele unvi cursor deschis care trebuie s& permit ‘operatii de actualizare. Daca exista att un cursor global, ct si unul local cu acelasi nume, atunei nume_cursor se referd la ‘cursorul global dac& se specifica optiunea GLOBAL gi la cel Tocal fn eaz contrar. nume_varlablla_cursor - este iwumele unci yariabile cursor, care se refera la un cursor deschis si actualizabil. Observatiis 1. Dack 0 operatic de actualizare violeaza 0 constrangere, 0 regu, fncearcd sf schimbe la NULL 0 colean care nu accept NULL oti ‘valoarea novi este incornpatibilé cu tipul de datt al cofoanei, atunci foperata este anulats, se afigeazd un mesaj de eroare gi mu se face nici o actualizare. 2, In anumite situaii operatia UPDATE poste fi nedeterminists, ceca ce se manifestt prin faptul & noua valoare a unvi atribut sau variabilé nu este unic determinatd, In aceste cazuri rezultetul ope Tatie! de actualizare este nedeterminat, De exemplu: sPeanzactii.Prot ROM oferte,Tranzactit WHERE, Oferte.CodP=Tranzactii.CodP Prin operatia UPDATE de mai sus se doreste aducerea preurilor de oferta la nivelul celor de tranzactionare, Desi corectd sintactic, ‘operatia de mai sus este ambigud si cu rezultat imprevizibil ori de cate ori pentru un produs exist mai mult de o tranzactie. 3, Se pot folosi nume de variabile tn instrucfiunile UPDATE pentru a stoca fie valoarea veche, fie cea nous «unui atribut. Folosirea acestei facilitai este recomandata pentru situafile cind operatia de actua- fizare se referi la 0 singur& tupl8, in cazul actualizarilor multiple vvariabila va confine valoarea cotespunzatoare ultimei tuple modt- Fioate. 141 Exempl 1 Reducere cu 10% a prepwitor pentru toate ofertete Pret 2% Reducere cu 10%6 a prepitor pentru ofertle cu prepa peste 1000: UPDATE oferts SED Pret=0.9+Pret wwe Prats 1000, 3. Reducer’ cu 10% a prejuritor la calculatoare Vartana compautbit cu standard SOL 92. UPDATE Oferte SET Pret=0.9+Pree, WHERE CoaP IN (SELECT coap FROM Produe WHERE mune="Calculator’) Variants cu extents SOL Server uroarE oferte SEP Pee Stree From Oferte, Produs MERE Oferte.Cod®-Predus..coaP AND dume= "Calculator Togaiere diferemiatd a prepritor (586 pentru pret mei ‘mic de 1000, 10°6 pentru de la 1000 la 1499 512096 de ta 06 ¢° 3) " roars oferee SEP Pret case Wom Pret°1000 AMD BcetclS0 muBN 0. s0epree ELSE 0.80*Pret pe PROM Oferte 5 Reducoe deren a prepeter (conde de mumai pentru calculatoare i! auto; i mete can BREN Frat>=1000 au peonety * ro 1500 THEN 0.90¢Pret 142 FROM Oferte, Produs NNERE oferte.codP=Pproaus.codP WHEN" "Calculator THEW 1 WHEN ‘Auto* THEN 1 ELSE 0 ENDL 6 Se marese cu 10% prefurile la auto sila produsele eu oferd unic UPDATE orerte SED Prete1.1*Pret FROM Oferte, Prods & WHERE Oferte.Cod2=P.coaP ‘AND CASE WHEN umes" ato" oH 2 ELSE (SELECT counr(*) FROM Oferte, Produs WHERE Ofarte.coaP=P.codP ‘ND Wine. Nune) Observatie: De remarcat la exemplele 5 si 6 modul de folosire al expresiilor CASE clauza WHERE. Aceste construct pot fi un fnlocuitor penta expresii care contin operatorul OR. 9.3. Exercitii si probleme 1. Si se reserie trazele UPDATE de la exemplele 5 gi 6 f8r4 a folosi expresii CASE in clauza WHERE, 2. Dafi un exemplu de posibili operatie de actual ire nedeterminista, 3+ Si se reducd cu 10% preful tuturor produselor pentru care exist eel pufin 2 oferte, ‘ise steargit ofertele pentru care nu sa incheiat nici o tranzactie. Sf se reducd cu 20% preful ofertelor pentru care cantitatea depigeste 1000000 buesi ori 100 tone si preful unitar este peste 1000, 143 atributelor a sib ‘dupa executia secvenfei urmitoare: CREATE TABLE x(a int, b int) INSERT x VALUES(1, 2) Pentru uniea tupli a tabelei x 10. VEDERI. SQL DINAMIC 10.1. Vederi © vedere este 0 tabi vitalé al cirei continue este detinit prio interogare. La fel ca orice tabelt reals, o vedere consi dinteun set de oot si se matecalizeao print-un set de tuple, Datele corespunzitoars ures wenn fu sunt memorate fnt-un obiect al bazei de dat, caea ce se memorosed coe fiazd SELECT pe baza cireia datele sunt determinate fn momenta vereca vederi. Din acest pespectivio vedere poate considera cao itoan brememorat.Iterogarea care defines o vedere poate fae eters Ie men mai multe table de bazA sau chiar veder, Vedeile se comport 9 pos fy folate ta fl ca orice tabeld de bazh In interopdr, dar tebule sd eyes Anumite restrict tn cazaloperafr de ergere,iseare sa setualionre In aplicai vederile pot file din mai mole puncte de vedere ~~ simplificarea si specializarea viziunii utilizatorilor asupra datelor Vederile pot fi vizute ca o suprastructurd, peste structura de fabele @ bazei de date, suprastructura care ofera grupurilor de Uutlizatori un model al datelor mai apropiat de ifelegerea lor gi de necesititile aplicatilor pe care le dezvoltt; gruputi diferite de utilizatori pot avea viziuni diferite asupra acelciagi colectii SA adere la crit 146 instructiune SELECT. Dac& are loc modificarea unei tuple din vodere, clauza WITH CHECK OPTION garanteazi faptul ci datole modificate rman vizibile in vedere. 1. Pentru orice interogare referitoare la o vedere, sistemul SQL Server verificd faptul e& toate obiectele referite in vedere exista si sunt valide in contextul bazei de date, iar In cazul operatilor de modi- ficare se verifica si nu se violeze nici una dintre constringerile de integritate de la nivetul tabelelor de baz. Dac’ toate aceste conditii sunt satisfacute, atunci operafia exprimatt fn termenii vederii este ‘radusil fn una sau mai multe operafii echivalente la nivelul tabelelor de baza, 2. Daca o vedere face referire la 0 tabel care intre timp a fost stearsi, atunci se genereaza o eroare la orice tentativa de utilizare a vederii, Chiar dact tabela lipsi este recreata cu aceeasi structuri vederea mane invalida. De aceea, ori de cite ori se modificd structura nei tabele sau vederi care este referiti de o alta vedere, aceasta din urma trebuie steatsi gi recreat 3. Definitia unei vederi este stocati in sistem tn mod similar cu definitia procedurilor stocate. Spre deosebire de acestea definitia ‘nei vederi este recompilati la fiecare accesare a acesteia Exemple: 1 Instruotiunea CREATE VIEW de mai jos produce 0 vedere numiti ‘Tranzactii_Desfasurat care confine toate tranzactiile impreund cu deta- liile corespunzatoare (nume si orag pentru furnizor si benefciar, numele produsului, cantitatea tranzactionatt si pretul de tranzactie) IF EXISTS (SELECT Table Name FROM Information Schema. VIBWS WHERE Table Mama = ‘Tranzactis-Desfasurat’) DROP VIEW Tranzactil_bestasurat 0 CREATE VIEW tranzactii_Desfasurat AS SEUECT Mune_Furnizor=Parnszor..une, oras_furnizor=Furnizor. Orag, Mune_Beneficiar= eneficiar- tune, Oras Denoficiar= Heneficiar. Oras, Mune_Produs= Produs Mune, Canticate, Pret. ROM Furnizor, Beneficlar, Produs, traneactti WHERE Furnizor.codP= Tranzactil.coar AND Beneficiar.codR-Tranzactii CogB AND Produs..Cod=tranzactii code 147 CCluj Bucuresti este definits pe baza vederi Chanaet Desfasurar si se refed doar la tranzactie Gare furnizori din ‘il, beneficiari din Bucuresti, atsibutcle weesee vederi vor fi qifntior.Benefciar si Produs aga cum este specifica hee woloane SELECT sencene A TE VIEW care are priritateasupralistatdie fees SELECT asooiati TF Parerens RUGCT Table Nene FHOM Tnformation_schena. VINE ore iabie Heme = ‘tranzaceil clu sucenny DROP VIEW Tranzactii_ Cluj mucuresey co cREATE view Tranzactis_cluj_pucus SELECT Mone_Furnizor, Mr FROM tranzact ii, Desf; WHERE Ovas_Purnizos Ores_Beneficia: wrest (Furnizor, Benet iciar, me_Boneficiar, Mine Produs Proaus) as co Yeas Asent_Comercilt pemitecefericeaunitar att la furizoi ts a benetiiar, tr waters (SELECT Table Mane PROM tnfornat ion_Schona. VIEWS HERE TableNane = "Agenticonarcielis} ‘DROP viEW agenti-Conereiall 20 GREATE VIEW Agenti_comeretalii(Cod,mine,Oras) aS SELBCT * FROM Purnizor onto SESBCT * FROM Doncficiar EF Oricare dintre vederile de mai © tabels obismuitt si, in gener tunora dintre interogsri: Numele beneficiarilor fuarnizori din Cluj? i sus poate fi invocatd fn interoggti la fel ca al, contribuie la exprimarea simplificatt a care au cumparat caleulatoare de la SELECT None_Beneficiar FROM Tranzacti3_Desfasurat, WHERE Oras_Purnlzor= "cla" AND ‘une _Produs='Calculacoare* Numele beneficiarilor din Bucuresti care ax cumparat calevla- toare de la furnizori din Cluj? SELECT Beneficiar FROM Transact it cluj_mucurests WHERE Produs="Caloulateare’ 10.1.2, Instructiunea ALTER VIEW lunei Vederi creat anterior. ALTER VIEW nume_vedere ((coloand {, n])] (WITH ENCRYPTION} AS instrucjiune SELECT (WITH CHECK OPTION) unde: ‘ume-vedere, coloand si instrucjiune SELECT - wu aceeag semnitiatie 6451 In cazul instructiunii CREATE VIEW. Observatie: Tack vedere inital «fost ereatt cu optiunile WITH ENCRYPTION pisau CHECK OPTION acestea sunt mentinute numai dact see speci- ficate si in instructiunea ALTER VIEW, Exemplu: Modificim definitia vederii Tranzacti Contin’ inclusiv valoarea tranzactilor: AUTER viEM ‘Tranactit_cluj_aucuresti (rurntzor, beneficiar, Prodvs, Valoate) as SELECT None Purntzor, Mune Benefl Nune_Produs, eree*Gantitate: FROM Transactit_Desfasuree WHERE Oras_Furniaor="Cluj" AND Oras_Beneficiar=‘Bucurestt ii_Cluj_Bucuresti astfel tneat si 0. 10.1.3. Instructiunea DROP VIEW ‘Sterge una sau mai multe vederi din baza de date, Sintaxa: DROP VIEW (nume_vedere} [, n) unde: ‘rume_vedere - este numele unei vederi care se sterge 149 1. La stergerea unui tabel print-o instructiune DROP TABLE, toate vederile care referd tabelul devin invalide, fark a fi automat sterse Ele trebuie sterse explicit (daca e cazull) prin c&te o comand’ DROP VIEW. 2. La stergerea unei vederi prin DROP VIEW definitia si toate cclelalte informatii despre vedere sunt sterse din baza de date. 3. Inceearea de a gterge 0 vedere care nu exist produce un mes de Exemplu: Dup& stergerea vederii Tranzactit_Desfasurat vederca definita pe baza fcestein, Tranzactii_Cluj Bucuresti, devine invalids, astfel c& orice referire a ea produce o eroare. 1 EXUSTS (SELECT Table_Name FROM Informat ion_schen.VIEAS WHERE Table_Nase = ‘Tranzactii Destasurat') DROP VIEW Tranzactis Destasucat Seupct + FROM Tranzacti Cluj Bucuresti tome vedere invalids 10.1.4. Modificarea datelor din vederi Efectuarea de modificdri asupra datelor din vederi presupune respectarea lunor restritii care se referd atat la vederi,cAt gi la instructiunile de modificare a datelor care actioneaz& asupra vederilor. in SQL Server o vedere este consideratt modificabil daca: + vederea refera (direct sau indirect) cel pugin o tabell' de baz’, deci hu este bazatl exclusiv pe una sau mai multe expres ‘+ lista SELECT a interogitii care defineste vederea nu contine 0 funetie de agregare sau una din opfiunile DISTINCT sau TOP. Interogtrile imbricate din clauza FROM pot contine functii de ‘agregare cu conditia ca valorle derivate din acestea sé nu constituie obiectul modificarilor. + fava SELECT nu confine clauzele GROUP BY sau UNION. + dact operatia este de inscrare, atunci vederea nu poate confine coloane derivate (obtinute dintro expresie, functie .a) in lista SELECT, 150 dact operatia este de stegere date (DELETE), atunci fraza SELECT care defineste vederea poate referi o singuri tabela de baz’ in clauza FROM. ‘+ numele unei coloane nu trebuie st apardi de mai multe ori fn lista ‘SELECT a interogirii care defineste vederea, in sistemul SQL Server 2000 o vedere care nu se incadreaza tn criteriile do mai sus poate fi totusi modificat’ prin triggere INSTEAD OF care permit explicitarea operatilor INSERT, UPDATE si DELETE. © alt categorie de vederi care pot fi modificate direct in SQL Server 2000 sunt vederile partitionate modificabile, Pe ling& criteriile pe care trebuie si le satisfact vederile pentru a fi ‘modificabile, se mai impun o serie de restrict si asupra operatiilor de ‘modificare a vederilor, si anume: 1. Coloanele referite intr-o instructiune UPDATE sau INSERT trebuie 8 apartind unei singure tabele din cele referite in definitia vederii, astfel Incdt s8 se poati determina firs ambiguitati tabela de baza la care se refer’ operatia, 2. Instrictiunea UPDATE sau INSERT se traduee into operatie Jegala 1a nivetul tabelei de bazé din punctul de vedere al constrin- gerilor existente la nivelul tabelului (cheie primara, choie strains, aceeptare valori NULL, valori implicite etc.) 3. Daca vederea este definita cu opfiunea WITH CHECK OPTION, atunci operatia de modificare trebuie si adere la criterlle stabilite prin fraza SELECT care defineste vederea, Astfel vor genera erori operatiile UPDATE care produc modificari prin care tuplele se exclud din vedere sau operatile de INSERT ale unor tuple cate na pot face parte din vedere, Exemple: 1. Vederea Data_Curenta creaté mai jos nu este modificabila, deoarece nu referi nici o tabela de bazi (confine © singura valoare rezultaté: din cevaluarea unei functii): CREATE VIEW Data Curent AS SELECT GETDATE() "AS Azi 151 Be umtione pete spe Sle vederea Furnizot_Cly definite asf oa : READE ViEW Purnizori_eiuy ag DELETE FROM Tranzactii_Nestasurat T * FROM Furnizor WHERE Oras Furnizorstengt ene orase mh gurmsaoe Cir cleealt deoarece vederea Traneactit Desfanurar este ddefinité prin 0 uplaea a. mai multe tabele de bask Operatia T]NSERT Purntzordcluj vatugs (suet: “Timigoaras) 3 4, Are ca efect inserarea unei tuple in tabela Furnizor, dar fii ca aceasta fe vz tm vedere, Dupt inetd oath zactie (care este de fapt con Nevers, Dep instruthunea de modifica face parte din vederea Trancacel Deg WPOATE Pusntzord ciuj sen Oreae'tiniesace, UOATE tranzact i Destasurat AUplele din tabela Furnizor care apartin ‘Vederii se modific, si. dispar f SEY Gras_rurnitor=" sonra! din vedere, 7 Fume cinuth opfinen WITH CHECK ta detniga. veer Une pee tein ie ntl Peng Perrt Ue xp pin praia ALTER VIEW AUEBR VIEW ruenizors elu} ns WeDME transactli Destanurae Freee mete | SEP Mine Proaaas hc eeiaor iene rare iw con ors % Pea de srr de mai jo et, de asemene, lea areca eee O tpl ere nl Produseroae ord tot exit el pn inserarea unei tuple in tabela benefician, elect CA fi afeciata de operatic i prin core se viola definitia Vederi, ns REECE Deefanurat ing. onesie, mal focal ez sasbsena opis WITH CHECK oper de vous (saver, sees Imai jos sunt secepae darn au ned arate UPDATE Purnizori_cluj S37 Orase'ciys & _Incerarea urmitoare este ilegald deoarece referdatibute din doua tabele rea ae (Furnizor si Benefician): DELETE Furntzori_cluj WERE Orascsciyj TIGER tranzactii_Destanurat fine peneficiar, Ora0_Beneficiar, nine Purnizor} " VALUES (*SANEK*, *Cluj', *TRIS") | 10.2. SQL dinamic eit dovlun Sistemul SOL Server oft posiiltatea dea ansa tn executie un gir de ON i tS ede cea Aen ain ef ea ei ma as ‘Smerciallcontine operator ‘incepind cu versiunea SQL Server 7.0 si Prin’ procedura stocati sistem INSERT agenti_Comerctati (ne, Oras) Se face ea ate devine variants prefer pent excita dines, oe ‘VALUES U'SULL';"Pimtacara’) Inotdeeaet A ECUTE, ori cx ap execute! un ni gee! te IRLETE FROM Agent comercial! WERE manos‘savex: de cae Routt coun bach de se stor SQL Serves conn sirul er : Sean de caractere si produce un Plan de executie care este Separat de planul de UPRAME Agenti_conor etal: ‘Ssesui al batch-lui din ae. lansat exec nsrugian EXE SET Mune="ZRIS‘ WHERE Mune! SANEX 153 rocedurii sp_executesql. La folosirea facilitatii de executie dinamict trebuie avute in vedere o serie de particularitti si anume: + Compilarea instructiunilor SOL din sirul de carnctere are Joe abia jn momento! lansérii in executie a instruciunii EXECUTE oti a procedurii sp_executesql. In acest moment are loc si verificarca corectitudinii acestor instructiuni si rezolvarea referinfelor (catre variabile!) existente tn gir. contextal batch-ului din care se lanseaza executia. Astfel sirul executat nu are acces ta variabilele din batch-ul care confine | instructiunea EXECUTE sau apelul procedurii sp_executesql. Reciproc, batch-ul din care se lanseazi executia nu are acces la * Daca sirul executat confine o instructime USE care schimba Contextul bazei de date, stunci aceasta schimbare are efect doar pe durata executieisirului nu afecteazi batch-ul exterior. Sintaxa pentru Jansarea in executie a unui sir prin instructiunea EXECUTE este: EXEC(UTE] ( ( @variabila_sir\[N} ‘ir SOL") (+ .n}) unde: Qvariabile sir - este numele unei variabile locale de tip char, varchar, nchar sau nvarchar a e&cei dimensiune este limitaté de spatial de memorie disponibil. Daca sirul de executat depageste 4000 de caractere Unicod sau 8000 caractere ASCH, atunci se pot coneatena mai multe variabile gir pentru a forma sirul de executat, (N's SQL’ - este un gir constant de tip nvarchar sau varchar. Daca © specific indicatorul ¥, atunci sirul se consider’ de tip varchar (ctractere Unicod) cu dimensiunea limitatt de spa de memorie disponibil. Dac& sirul de executat depaseste 4000 Se caractere Unicod, atunci se pot concatena mai multe ile sir pentru a forma sirul de executat, Lansarea th execute au face dupa urmatoarea sintaxi: nui sir prin procedura sistem sp_executesql se sp_exceutesql [Gistmt =] instrucftune {(, @params =)N'@nume_parametru ti data {sn} ) i ((@nume_parametre =) valoare ben] {] 154 ~ unde: instruciune- este wn si Unicod constant sau 0 variabil sir Utiod, Nu sunt permise concatenate srr ine irre de caractre ASCI (0 constant gir vafpecedat de inicatorl 2), Sirul poate contin pacamettiavind aceasi form ca gun sume de variabll. Plecare parametru trebuie st aiba un corespodent i sta de parameti gn sta de valor " i inicod [@params =] N'@rume_parametru tip_data (yn) ~ este un gic Ui constant sau o variabila gir care conjine defintile tuturor parametrilor din sirul executat. Definitia fiecirui parametru consté dintr-un nume de parametru si un tip de dati, [@nume_parametra =} 'valoare'[, ni} - este o list de perechi de forma ‘ume-valoare prin care se atribuie valori parametrlor. Valoarea atribuita poate fi o constants sau o variabilé (nu sunt permise functii sau expres!) Observasii: 1, Apelul procedurii sp_executesql returneaz’ 0 daca sirul s-n executat ‘cu succes gi 1 in caz contrar 2. Sunt returnate toate relafile rezultat produse de frazele SELECT din sirul executat, 3. Procedura sp_executesql asigura executia unei scovente de instruc tiuni dintr-un sir de caractere parametrizat care se poate construi in ‘mod dinamic §i se poate reutiliza de mai multe ori 4. sp_executesql se poate folosi in locul procedurilor stocate pentru ‘executia repetati a unci secvente de instruetiuni atunci cand modifi- carea valorilor parametrilor este singura variate de la 0 executie la alta, Executia dinamicd a instructiunilor SQL ofert 0 flexibilitate care se dovedeste a fi utili, uneori chiar indispensabili, tn aplicati, Aceast& ‘lexibilitate aduce cu sine o oarecare penalizare 1a timpul de preluerare, datoritt faptului cd are loc o recompilare si construirea unui plan de executie nou pentra flecare lansare in executie a secvenfei dinamice. Acest luctu este inevitabil deoarece 0 secvenfa dinamic& este, in principiu alta, la ficcare cxecutie, find dependenta de vatorile actuale din contextul batch-ului din care se lanscaz executia. Totugi, aceste penalizari sunt, de cele mai multe ori neglijabile gi pe deplin compensate de avantajele exccutiei dinamice, Executia oricarui sir de Caractere se face intr-un context propriv, izolat de contextul batch-ului din are 155 ~eorettt USE Agencs SELECT * FROW Furntzor EXECUTE (-USE Agents SELECT * FROM Purnizor~) le de sini jos sunt gresit esi BXBCUTE (“USE Agenti +) SMBCUTE(-Seuzct * FROM Furnizor*) merit USE Agent BRECUTE(*SELECT * PROM Purntzor®) pei EXECUTE ("USE Agenti =) SELECT * FROM Purnizor Cele dow' intrucy fioni EXECUTE din secventa de mai jos au acelasi fect: DECLARE Grume_tabel varchar (10) DECLARE @sir Sot, varcnar(1000) SE Gnune_tabel='Furnizor: SEP @sir SOL! SELECT * PROM ‘+8nune_tabo EXECUTE (‘SELECT + PROM *+@nun EXECUTE(@eix sot) taben) fie *_cimp PAO Furnizor") Produce 0 eroare de tip variabila nedectarata, a Pentru a putea insera, tn sil de executat, valoarea unei varabile jarrczentdnd un sir de caractere, acestatrebuie sa fie Tacadrat tre” ™, seo celiunes QUOTED IDENTIFIER twebule st fe sclad he OFF aomeee, in esz conta, valoaea varabilei se va interprets co we idemtficator: DECLARE @nume_oras varchar(10) SET Gnume_oras='chuj: ‘SEP QUOTED_IDEWPIPTER OFF EXECUTE( SELECT" FROM Furnizor WHERE Oras=*"s@niane_orase***) Acest exempla pune in evident mod de foosite a procedutt sistem sp_exeeutesqlcomparatiy eu insiactinea EXECUTE (eee o fi spl procedristocate sp_exeeutesgl se face tt prin EXECUTES In cuz exceuiei prin apeulprocedutt sistem sp executes shave {xecutat nu este reonstrut dupt fecare modifiars» mumeh de ence ci ‘se fice apehil doar cu’ valoarea’modificatt a perasesney @par-Amme.pras DECLARE @nune_ovas varchar(10) DECLARE @sir_S0L varchar (1000) utilizar insructine EXECUTE SEP QUOTED_IDENTIFIER OFF SEP grune_o1 SEP @aSr 50 SELECT * PROX Furnizor WHERE Oras EXECUTE(@siz SQL) cies" SET @nume_orae='mucurest* SEP Geir_sQle “SELECT * FROM Purnizor WHERE Orase**+Snume_oras+ EXECUTE (@sir_sqv) DECLARE @six_paranetri nvarchar (1000) SEP @sir_sLeN'SELECT * FROM Purnizor WHERE Oras=@par_nune_oras" ‘@par_nune ores varchar (20) + lizae procedrn sp_execoesgt S8n Qnune_oras=' Cluj" EXECUTE sp_executesgl @sir_sot, @sir_peranetri, epax_mume_ora: SBE @numé_oras=“Bucuresti EXECUTE sp_executesq] @2ir_soL, @sir_paremetri, epar_mume_oras-@nme_oras Se 7 Observatii: Procedura sp_executesql are tai multe avantaje fats de executia directa prin instructiunea EXECUTE: — Parametri care apar in girul executat se transmit in forma nativa {itd a fi nevoie de conversii explicite tn siruri de caractere. = De multe ori ekecufia repetati prin sp_executesgl poate reduce Considerabil penalitatile inerente in cazul folosirii instructiunii EXECUTE, Acest lucru se datoreaz4 faptului ck SQL Server va Incerca s& reutilizeze planul de executie generat la prima lansare fn executie ori de cfte ori se reexecuta un sir cu alte valori ale parametrilor. 2. De remarcat c& nu se pot transmite numele de tabele din clauza FROM ca parametrii la un gir executat prin sp_executesql. In aceste cazuti este necesara reconstruirea sirului de executat Intro ‘manierd similar& executiei prin instructiunea EXECUTE. 3. Scoventele de mai jos actualizeaza cantititile de produse oferite din tabela Oferte ori cerute in tabela Cereri. A se remarca faptul ci valorile intregi pentru atributul cantitate trebuie convertite la un sir de caractere atunci cind se foloseste instructiunea EXECUTE, La schimbarea numelui de tabelé sirul de executat trebuie recons- ‘nuit chiar 5i atunci cand se foloseste procedura sp_executesql. DECLARE Geantitate tat DECLARE Osiz_cantitate varchar(20) DECLARE Stabel varchar (20) DECLARE @sir sol nvarchar(1000) utiliza insretione EXECUTE Ser Gtabel=" oferta: SEP Gsir_sQL*'UPDATE ‘+6tabels' SED cantitaten intitater SET Geantitate=100 SET Gsir_cantitatesconvER?(varchar(20) ,@cantitate) EXECOTE(@sir_sQLtGeir_cantitate) liar proedra gp_ executes DECLARE’ @sir_parametri svarchar(1000) Set @eix_sote UPDATE ‘-étabo1+" SEP cantitate-cantitatesdpar_cantitate’ SET Osiz_paranetri=n'dpar_cantitate int ~actualizari Ofer fara refaceea sli de executat Qs SQL SEP Geantitaten150 ve EXECUTE sp_executesgl @six_S0L,@sir Daranetri, épar_casititats SET @cantitate=200 158 - EXECUTE sp_executesql @sir_S0L, sir_paranetri,@par_cantitate-dcantitate ~-refacerea sri de exectat @sit_SQU.pentra a actusliza abel cere SEP Osir_sot= r WUPDATE ‘sdeabel+' SEP Cantitate-centitate+Spar_cantitate’ EXECUTE sp_executesq) sir SOL, @sir_parametri,@par_centitatesGcantitate 10.3. Exercitii si probleme 1. Fie vederea Oferte_Desfasurat definita prin instractiun CREATE VIEW Oferte_Desfasurat AS SELECT ‘Nune_Furnizox=Furni zor.Mupe, Oras RisnizorsPurnizor Oras, ‘une Produs= Produs. Mune, cantitate, Pret, Valoaxe=cantstate*Pret FROM Furnizer, Oferte, Produs WHERE Furnizor.codP= oferte.codF ‘AND Produs.CodP= Oferte.CodP ‘S8 se arate care dintre instructiunile de mai jos este legal i care nu: UPDATE Oferte Desfasurat SET Oras Furnizor='Timiaoara’ UPDATE Oferte Desfasurat SET Mine_Produs= "Tolevizor’ WERE Nune_Produs="auto' INSERT Oferte Destasurat (Mune Purnizor, Oras Furnizor) VALUES: (*SANEX", *C1uj") 2. le vederea O definiti prin instruefiun CREATE VIEW 0 AS SELECT * FROM Oferte SELECT * FROM oferte Este vederea O modificabila? Ce ambiguititi apar in cazul unei operafi de forma: UPDATE © SET cantitate-cantitate+100 3. Fle vederea FF definiti prin i CREATE VIEW FF NF,O1,02) AS SELECT F1.tune,Fi‘oras,P2.0ras PROM rurnizor FI, ‘Furnizor ¥2, WHERE P1.CodP=F2 cod? tructiunea: 159 160 Explicati ce se intimpla tn cazul urmitoarei operatii de modificare: UPDATE FF Sev o1-‘Rucuresti Este permis urmatoarea operatie: UPDATE FP sez 01 Ce ambiguitati pot s& apara? Bucuresti ,02="cluj* 7 Ce erori apar Ia instructiunile de mai j EXECUPE(*SEnECT * FROM Purhizor WHEE Oras=cluj') EXECUTE( "SEP QUOTED IDENTIFIER ON SELECT * FROM Furnizor WHERE Oras=*Cluj*') EXECUTE(*SELRCT * FROM Btabel'] Si se rescrie secvenfa de mai jos astfelincat operaia de actualizare si fie executati sub controlul procedurii sp_exeeutesql. DECLARE @table_name varchar (50) DECLARE field varchar (50) DECLARE value varchar (50) DECLARE Gnewalue varchar (50) SEP @table_name='Purntzor! SEP @field='orast SET @value='Cluj* SED Gnewelve= ‘Timisoara! EXECUTE(‘UPOATE ‘+Stable nanes' Sur ‘+ Ofielde'=" + Gnowalues‘* WHERE *+8field+‘=**savaluer"**) | | } | 11. PROCEDURI STOCATE Atunci cAnd se foloseste SQL Server la dezvoltarea aplicatiilor (de exemplu tntr-o configuratie client-server) se poate vorbi, in prineipiu, despre ‘dou optiuni de bazi pentru stocarea si executarea programelor. Programele pot fi memorate local la nivelul aplicatilor care trimit comenzi ektre SQL Server si prelucreazi rezultatele returnate de acesta. A. doua optiune presupune dezvol- trea si fnregistrarea programelor ca proceduri stocate in SQL Server si crearea de aplicatii care apeleazi aceste proceduri $i prelucreazti rezultatele retucnate de acestea, Procedurile stocate din SQL Server sunt similare procedurilor din alte limbaje de programare in sensul c&: © accepta parametrii de intrare de la si retumeazi valori prin parametti de iesire eitre un program apelant; * contin instructiuni de programare care efectueazs operat in baza de date gi pot apela, Ia randul lo, alte proceduti stocate; ‘© retumeazi catre apelant 0 valoare care indick succesul sau esecul cexecutici procedurii, eventual cauza esecului, © proceduré stocatt se poate lansa tn executie prin comanda EXECUTE, Procedurile stocate au un comportament diferit fati de finctile din SQL Server in sensul ci nu returneazA o valoare in locul numelui procedurit i, deci, acesta nu poate fi folosit direct fn expresil Utilizarea procedurilor stocate prezinté mai multe avantaje fati de ‘arianta programelor stocate la nivelul aplicatilor utilizator: + Programare modulari © procedurtstocatt poate fi cretto singurh dats yi apelat de mai multe ori din mai multe aplicati. Mai mull, procedura Socaté poste f reat de ere o persoané specializat in buze de date gi poate ff modifiath independent de aplicaile care 0 apeleazi + Performanfi tmbundtafitt {ncazul programelor cu volum mare de cod sau a celor excuiate in mod repetat procedurilestocate sunt mai ecient deoacece compares si optimizarea lor se face 0 singur da I eearea proceduris sunt memorate into forma diet exeoutbil pein Care se eviti repetarea fazelor de compilare gi optimizare Ia fiecareapel al procedu 161 + Reducerea traficului de refea © prelucrare care presupune executia a sute de liniiade cod poate fi realizath printro singura linie de comanda care apeleaz procedura stocati prin care este implementata acea preluerare, Se evita astfel transmiterea prin rejea a codului Fespectiv la fiecare executare a acelei preluerari. + Ofer un mecanism suplimentar de securitate Uiilizatorii nu au acces direct la codul procedurilor stocate, iar dreptul de executie al unei proceduri poate fi acordat sau nu in fuctie de statutul fiecdrui utilizator de catre administratorul bazei de date. In SQL Server o procedur stocta este cteata prin comanda CREATE PROCEDURE si poate fi modifica ulterior print-o comands ALTER PROCEDURE. Defiifa uneiproceduristocate confine wmdtoarele element: + specificarea numelué procedril si a parametrilor; + corpul procedurit, care contine instructiunile SQL ce realizeaza prelucrarea pentru care a fost creat procedura, 11.1. Instructiunea CREATE PROCEDURE CreeazA 0 procedura stocatd cu caracter permanent ori temporar pentru Uutilizare tn sesiunea utilizatorului curent (procedura temporard locala) sau tn fonte sesiunile utilizator deschise Ia un moment dat (procedura temporara elobala). Procedurile stocate pot, de asemenea, st fie create pentru lansare ‘automati in executie la pornirea SQL Server. Sintaxa: CREATE PROC[EDURE] nume_procedura (ynumar} c (paramere tip.de data) (VARYING) = valare implicit ial (wire (RECOMPILE HENCRYPTION | RECOMPILE, ENCRYPTION) wd) (FOR REPLICATION} AS Instructun sal (.m} 162 unde: nume_procedura - este numele procedurii stocate care se ereeazA. Prin conventie, numele unei praceduri temporare locale ineepe cu simbolul #, iar al unei proceduri temporare globale cu Mi Numele unei proceduri poate avea cel mult 128 de caractere, jumar ~ tntreg optional folosit pentru a reuni mai multe proceduri cu acelaji nume intr-un grup. Toate procedurile dintr-un grup pot fi terse cu o singura comand’ DROP PROCEDURE avind ca parametru numele comun al procedurilor din grup. @parametru - este un parametru al procedurii stocate. O procedura stocata poate avea pind la 1024 parametri care se comporti in ceadrul procedurii ca orice variabili local. La execuie un para- ‘metru poate lua doar o valoare constanta si nu poate fi folos Tocul numelor de tabele, coloane sau alte obiecte din baza de date. tip_de_data - este tipal de data al parametrului. Toate tipurile de data, inclusiv text si image, pot fi folosite ca parametru. Totugi,tipul de dati cursor poate fi folosit doar pentru paramettii de tip OUTPUT (de iesire). La specificarea unui tip de dati eursor, cuvintele cheie VARYING si OUTPUT tebuie, de asemenca, specificate VARYING. - specificd relatia rezultat suportatd ca parametra de iesire Se aplica numai la parametrii de tip cursor. valoare_implicitd - este valoarea implicit a parametrului. Dac& 0 ‘asemenea valoare este definiti, atunci la apelul procedurii se Poste omite specificarea unei valori pentru acest parametr, Valoarea implicita poate fi o constanti (care poate include caracterele speciale %,_ {], si [*] atunci cand parametrul este utiliza cu operatorul LIKE) sau NULL. OUTPUT - indica faptul c& parametrul curent este unul de iesire si poate fi folosit pentru a retuma valori dinspre procedura. Tipul de dat text (sau echivalent) este interzis pentru parametri' de tip OUTPUT. ‘»- indica faptulc& 0 procedur& poate avea mai multi parametri, ping la 1024, (RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION) + optiunea RECOMPILE indica faptul c& procedura va fi ecompilata fnainte de fiecare executie a sa. Optiuinea 163 FOR REPLICATION ~ aceasta oj AS - marcheazA tneeputul corpului procedi ENCRYPTION indica faptul cd textul procedurii va fi memo- rat sub forma Tneriptata plume se exclude reciproc eu opfiunes WITH RECOMPILE. $i specifica faptul cf proce: dura curentt este creati pentru provesul de replicare si nu poate Ai exccutata decat pe serverul curent, ‘instructiuni_sql [..n}- instructiunile SQL. care formeaz4 corpull proce- durii, Tntr-0 procedura. pot exista mai multe instruetiuni cu Fespectarea urmatoarelor restrict Se respect toate regulile specifice unui batch SQL (o Procedurf stocatd este 0 unitate independenta de compilare), * Se poate include orice instructiune de tip SET cu exceptia: SET SHOWPLAN TEXT si SET SHOWPLAN ALL: optiuile SET acceptate rimén in vigoare pana ta iesirea din procedura; * dacd procedura stocati umeaza si fie folosita gi de alti utilizatori decét cel care creeazA procedura, atunci numele de obiecte uilizate in urmitoarele instructiuni: ALTER TABLE; CREATE INDEX; ~ CREATE TABLE; ~ toste instructiunile DBCC; — DROP TABLE; = DROP INDEX; ~ TRUNCATE TABLE; ~ UPDATE STATISTICS trebuie prefixate prin numele proprietarului obiectului respect. * urmatoarele instructiuni de tip CREATE mu pot s& apari intr-o procedura stocata: ~ CREATE DEFAULT; - CREATE PROCEDURE; = CREATE RULE; ~ CREATE TRIGGER: — CREATE VIEW, ‘* pentru obiectele care se pot crea intr-o procedurd stocaté tre- buie respectatt condijia ca acestea si fie referite doar dup crearea lor: © procedura stocati poate accesa tabele temporare, dar trebuie avut in vedere faptul c& o tabela temporard creat. Intr-o procedurd dispare [a iesirea din procedurts * procedura apelati de o alti procedura are acces Ia toate obiectele create de procedura apelanta (inclusiv tabele tem- porare!); 11.2. Instructiunea EXECUTE fn urma executiri cu succes a instructiunii CREATE PROCEDURE ‘numele si textul proceduri stocate corespunzitoare sunt inregistrate fn tabelele director: ale SQL Server. La primal apel de executie a procedurii are loc compilarea acesteia $i construirea unui plan de executie optimizat, Lansarea in ‘xecuie @ unei proceduri stocate se face cu comanda EXECUTE, Sintaxa: (EXEC(UTE) { \@vioee rer {name procedera [mar @valble pune procedara ‘eeeare =] (valoare | @ variabila [OUTPUT] | (DEFAULT) [, n} (WC RECOM EE} unde: @yaloare_retur - este o variabili optional de tip intreg in care se ‘memoreaza valoarea de retur a proceduri stocate. nume_procedura - numele procedurii apelate, Dack se apeleazi o ‘rocedura dintr-o alts baz8 de date (si, eventual, alt server) decit cea curenta, atunei numele proceduritrebuie prefixat eu numele bbazei de date (gi al serverului) in care se ghses si unde se executt. Numele tne proceduristocte este case-sensitive! jnumar ~ are aceeasi semnificatie ca si in cazul comenzii CREATE PROCEDURE, @vaviabila_pume_procedura - este numele unei variabile ce confine sumele unei proceduri stocate, 165 | 166 @parametru - este numele unui parametru al procedurii aga cum a fost definit prin instructiunea CREATE PROCEDURE. In variants de apel de forma @parametru = valoare, perechile de forma ‘hume-constant& pot si apart si tntr-o ordine diferits fala de cen Gat la crearea proceduri. Totusi, dacd se foloseste forma @parametra = valoare pentru un parametru, atunci ea trebuie folosits pentru toti parametri proceduri. valoare - este valoarea parametrului. Dacd nu se specifica numele para- metrului corespunz&tor, stunci valorile trebuie date in ordinea definici parametrilor corespunzatori, Gvariabila - este numele nei variabile in care se va rcturma valoarea ‘unui parametru de tip OUTPUT. OUTPUT - indica faptul & parametrul este de tp iegre. Un asemenea parametru trebuie asociat la apel cu o variabld de tipul valor Sean cetummeaz8 prin parametrul corespunzitor (in. forma, Gparametrs = @variabila sau simpla @variabila). Variabia asociatf unui parametru de tip OUTPUT poate fl iniializata cu 0 Yaloare care este accesibilli tn interiorul procedurl, cees oo OUTPUT Ia crearea proceduri,atunci se genereazi o ensure DEFAULT - indict faptu cd se va lua tn considerare valostea impliciea forma: Gon aft cum a fost definité Ia crearea proceduti (i foams, Gparametru = DEFAULT sau simplu DEFAULT) Poe drome nt a defnitho valaro implicit, stunci se va genera 11.3. Instructiunea ALTER PROCEDURE Modificd proceduri stocatt creat anterior fit a afecta Mm vreun fel obiectele dependente (proceduri stocate sau trggere care apeleazt procedura). Modificarea prin instructiunea ALTER PROCEDURE este preferati variantei care presupune stegerea si reercarea procedurii deoarece, jn acest caz, proce- durile sau tiggerele dependente nu mai trebuie recompilate. Sintax: ALTER PROC[EDURE] nume_procedura [yuumar] i (@parametratip_de_data) (VARYING) [= valoare_implicits] {OUTPUT} Aa) (wire {RECOMPILE HENCRYPTION I RECOMPILE, ENCRYPTION) } (FOR REPLICATION} AS instructions.) Unde toate elemente de sintax& au acceagi semnificafe ca gi in cazul instruc- tiunii CREATE PROCEDURE. 11.4, Instructiunea DROP PROCEDURE ‘Serge una sau mai multe proceduri sau grupuri de proceduri din baza de date curenté. Nu se pot sterge doar anumite proceduri dintr-n grup, ci doar grupuri tnregi de proceduri care au acclasi mume, Stergerea unel procedur! Inseam’ eliminarea definitci sale din baza de date Sintaxa: DROP PROC(EDURE] nume_procedura [, n] unde: ‘ume procedura - este numele procedurii sau al grupului de proceduri care se sterge. 167 l l | | | | | | 11.5. Exemple de utilizare a Procedurilor stocate plu t: Procedura stocata de fefiniti mai jos contine o singurd frazt SELECT care returneaza date despre tranzacille exishevte AND type = ‘P+ DROP PROCEDURE tranzactil Desfacscte 0 CREATE PROCEDURE T=anzactii_pestasurat as SELECT Furnizor.Nune, Heneficiar.mme, Produs Mune, Cantitate, Pret FROM Furnizor, Beneficiar, Produs, Tranzactsi WHERE Purnizor.codP=trancact i! code AND Beneficiar.Cod®-Pranzactil..Codp ‘AND Produs.CodP=tranzactii code 00 acclasi nume si in caz afirmativ aceasta se distruge. SQL Server face distinc tia dintre dow’ proceduristocate exclusiv prin nume (care include finimirul proceduri ta cadrul unui grup!), motiv pentru care tn acecasi baza de date nu sunt acceptate doit proceduri cu acelasi nume Lansarea in exceujie a proceduri Trancacti_Desfasura,cretl mai sus, 8° Poate face cu instructiunea EXECUTE urmata de numele proceduti mplu 2: EXECUTE Tranzactsi_Desfasurat Si tnlocuim procedura de mai sus printr- variants parametrizath ¢are retumeazi doar tranzactile dire furizor si beneficiar din dus orage date ea parametns IF EXISTS (SELECT name FROW sysobjects WHERE name = “Tranzectii_Desfamurat* AND type = +p*) DROP PROCEDURE Tranractii_pesfasurat 0 (CREATE eROCEDURE ‘Teanzacti_Desfasurat (@oras_furnizor varchar(15), @oras seneticiar varchar (15}) As SELECT Furnizor Mune, Beneficiar .Aune, Produs.Nune, Cantitate, Pret FROM Purnizor, Beneficiar, Prods, tranzact{i WIDRE Fusnizor-coaretransactil Cor AND Beneficiar.Codsetranzactii .cods AND Produs..CodP=tranzactii.codi aND Furnizor.Oras-0ras Purni ror AND Beneticiar.cras-oras eneficiar 0 ‘Tranzactile furnizorilor din Cluj cu beneficiari din Bucuresti se obtine prin oricare din apelurile: EXBCUTE Tranzactii_Destasurat ‘Cluj’, ‘Bucurestl! EXECUTE Tranzactit Det Bucuresti, Cores Purnizor= ‘clus ira furnizorilor din Alba cu beneficiari din Bucuresti se obtine prin: EXECUTE Tranzactit_pesfasurat ‘Alba’, ‘Bucuresti ‘sau orice alt apel echivalent. Exemplu 3: Varianta parametrizatl a procedutii se poate adapta s& returneze toate tanzactile atunei c&nd apelul se face fra parameti, pastrind nemodificat comportamentul fn celelalte cazuri: TF EXISTS (SELECT name FROM sysobjects WHERE nane = 'Tranzact4s_ De DROP PROCEDURE Transact bes! co CREATE PROCEDURE Tranzact1i_Desfasurat @oras_Purnizer varchar (15}=" @oxas Beneficiar varchar (15 as SELECT Furnizor.Nune, Beneficiar.Mune, Produs Mune, Cantitate, Prot FROM Yurnizor, Beneficiar, Produs, Tranzactit WERE Yurnizor.codr=mranzactit .coar AND Beneticiar.Cods=ranzactil .CodB AND Produs.CodP=tranzactit .coa? AND Turnizor-oras LIKE @Oraa_Purnizor IND Beneficiar.Oras LIKE dOras Beueficiar co {in acest cax apelurile: EXECUTE Tranzactii_pesfasurat ‘Cluj*, ‘Bucuresti! EXECUTE Tranzactii-pesfasurat ‘Alba", ‘Bucuresti: au acelasiefet ca la exemplul 2), fn timp ce apelu —_—_—_—— EXECUTE Tranzactii_Desfasurat returneazi toate tranzactiile denarece expresile: Furntzor.uras Likk “¥* si Boneficlar.oras LIKE '$" ‘u valoarea TRUE indiferent de valoarea atributelor oras, Exemplu 4: Varianta urmiitoare a procedurit retumeaz8, prin parametrul @suma de tip OUTPUT, valoarea total a tranzactilor din relatia rezaltat. Procedura retumeaz4, de asemienea, 0 valoare care indicd starea prelucrarii: 0, dac& exista cel putin o tranzaetie in rezultat si, parametrul suma are o valoare valida, respectiv 1 in caz contrar. TP EXISTS (SEUECT name FROM sysobiects WHERE nace = “Tranzactii_Desfasurat' AND type = ‘P') DROP PROCEDURE Tranzactii_peafasurar co CREATE PROCEDURE Tranzact ii Desfasurat ( @oras_Purnizer varchar(15)='8", @oras_Beneticiar varehar(15)='%", @total money oTpUr) TF sxisne(seuscr + FROK Furnizor, Beneficiar, Pranzactii WHERE Furnizor CodP-tranzactii.cod? AND Beneticlar.codseTyanzactis. Cogs AND Furnizor.Oras LIke Wras_Purnizor BND Boneficiar.Oras LIKE Goras_Beneficiar) ecm Rise 170 SEP @total= (SELECT sum(Cantitate*Pret) FROM Furnizor, Beneficiar; Tranzactit WHERE Furnizer.codP=?ranzactii -Cog? ‘OND Beneficiar.codB-Tranvactit .Cods AND Furnizor.oras LIKE €oras_Parnlzor AND Benoficiar.Oras LIKE Oras, Beneficiar) SELECT Purnizor.tune, Beneficiar.Nune, Produs tune, Cantitate, Pret FROM Furnizor, Bencficlar, Produs, Tranzact i WHERE Purnizor.codP=tranzact: .coar AND Beneficiar.coaseTranzact 14.coda AND Produs.CouP=Mranzactii.codP AND Furnizor.oras LIKE Oras. Furnizor menahD Beweciciar Ores LIKE Goran. benaticiar co RETURN 1 sees otc ab Reacal Sie Theil emt ae Mi es pentru tranzactiile dintre furnizori din Cluj i beneficiari din Bucuresti. DECLARE @suma money DECLARE #euma Cluj Bucuresti money DECLARE @status int EXECUTE estatu: ‘Tranzactii_Desfasurat DEFAULT, DBPAULT) @suna OUTPUT ar @status-0 ELSE BXBCUTE @atatu: PRINT ‘Suna totale @ tanzactiiior este: ' convert (varchar (30) , sua) PRINT “Nu sint tranzactii! ‘Tranzactii_Desfasurat ‘cluj*, "Bucuresti", (suna_cluj_sucuresti oUTrUT Observati PRINT "Suna totala a tranzact{iior efectuate intre'+ "'cluj si Bucuresti este" scomvert (varchar (30) ,deuna_Cluj_ Bucuresti) PRINT ‘hu int trenzactil Intre furnizori din'+ ‘elu 8k beneficiari din Bucuresti” 1, _Laprimul apel al proceduri: EXECUTE @atatue: Transact ii-Desfasurat DEPAUL, DEPAULE, @suma OUPEUT este necesara precizarea cuvdntului cheie DEFAULT pentru primi oi parameti,nefind acceptatéo variant de forma: EXECUTE Gstatus-tranzactii Desfasurat,,@suna OUTPUT (O alts varianta de apel, acceptatl in acest caz este: EXECUTE Ostatus=Tranzactii_pesfasurat total 2. De remarcat c& atat parametrul de tip OUTPUT, edt gi valoarea de retur pot fi complet ignorate Ia apelul procedurii Tranzactii_Desfasurat. Astfel apelurite: m EXECUTE @statusePransactii_pesfasurat EXECUTE Tranzactsi Destasurat Sunt valide si intore ca rezultat lista tuturor tranzactilor (in plus, Primal apel retwrneazi gi starea prelucrarii presupundnd ci variabila @starus a fost corect declarata anterior), ). Exercitii si probleme 4. Si se serie 0 proceduri stocati care are ca parametru un nume de produs si produce ca rezultat lista ofertelor pentru acel b. Si se adauge Ia procedura de mai sus un parametru de tip OUTPUT prin care se va returna media valorilor ofertelor pentru produsul dat, SM se scrie o proceduri stocat8 aviind ea parametrt numele unui ‘Produ, un pref minim si un pret maxim. Procedura va serge acele pentru produsul dat care nu se ineadreaz4 fare preful minim 4 pretul maxim. Duck la pel nu se precizeaca mumele produsulu Atunci se vor Iain considerare pentru stergereofertle pentru toate Produsel. Daci lipseste unul dinte limitle de pret ori ambete, atunci se va tine cont doar de limitele rimase. Apel fied para, metri va sterge toate ofertle! Procedura va intoarce ca valoare de relur numral de oferte care au fosters. Fie procedura: CREATE PROCEDURE P(@x int=0,ey int OUPEUP, Gz int=0) As RETURN TSWULL(@x+¢z, 111) i declarafile de variabile: DECLARE ga ine DECLARE @> int DECLARE @e init DECLARE Bretur int SH se arate care dintre urmitoarele apeluri este corect si care nu. @. ERBCUTE P ey-ca b, EXECUTE P DEPAUL, €a,DRFADLE €. EXECUTE P DEFAULT, fy-¢a, DEPAUL d. execure oretu DEFAUL?, @y=Ga, DERAULE © execure p 1. Execure ereturse & EKECUTE eretursP ,e> he EXECUTE GretursP NULL, €b,NULL, EXECUTE @retursP NULL ,NULE, WL Je mxecurs éreture? ep, k EXPCUTE Greture? @ar3,0b,86 1. Execure @retur=P a, @b+1,¢¢ meneert ianee eet aics YB Cll es mem one emer a a. EXECUTE Gretur=P 1,0b,1 os b. execure eretur-P 1,0 ourrur 3 © EXECUTE Gretur: oye oureur d. EXECUTE @retur=P 1,6 oUTFOR, NOLL . EXBCUNE Gretur=P NULL,Ga OUTPUT ULL {. exscure oretur=P etursP @a,@a,€a Ib, execure eretur-P a, 08 OUTPUT, Ga 173 12. CURSOARE SQL SERVER Specificul bazelor de date relationale, sal limbajului SQL tn particular, ‘este modul de operare asupra relatilor ca un tot unitar. Orice operate, se face asupra setului complet de tuple care satisface anumite condifi. Cursoarele Consttuie un mod complementar de lueru prin care se permite aecesul a tuple, tuna céte una, si prelucrarea independent a fiec&rei tuple in parte. Prin intro. ducerea cursoarelor se aduce o extensie utilé limbajului SQL care este astfe] Sntrogit cu toate facilitatile specifice limbajelor navigationale: = pozitionare pe o anumita tpl, = modifictri ale tuplei de Ia pozitia curentt; deplasare cursor inainte-inapoi; prelucrarea subsetului de tuple incepind de ta pozitia curenta samd. De remareat cf nu este utilé folosirea cursoarelor in operatiile obisnuite cate se pot rezolva prin fraze SQL. Cursoarele au fost introduse ca o extensie $i fu ca alternativa la frazele SELECT, UPDATE $.a.m.d. care sunt, in general, ‘mult mai rapide, O prelucrare bazati pe cursoare se desfisoari in mai multe faze dupa ‘cum urmeaza 1. Declararea unui cursor - unui nume de cursor i se asociaz’ setul de tuple rezultat corespunzator unei fraze SELECT; de asemenea se specific’ o serie de caracteristici ale cursorului, Deschiderea cursorului - se executi fraza SELECT asociata, realizdndu-se ceca ce se numeste popularea cursorului Tncarearea eursorului - se pozitioneazd cusoru in rept unei ‘uple sis realizeaz4 accesul la continutul acest Prelucrare - se executa operatiile specifice aplicatei. Inchiderea cursorutui - se sterge setul de tuple cu care §-a populat ‘cursorul, dar se mengine cursoral in sine impreund cu definita sa, Dealocarea cursorului - se sterge cursorul impreun cu definitia 12.1. Instructiunea DECLARE CURSOR Defineste atributete unui cursor gi setul de (uple ou care se populeaza. In Prezent instructiunea DECLARE CURSOR din SQL Server acceptt atit sintaxa bazata pe standardul SQL'92, cit o sintaxA extins cu o serie de facilitati specifice sistemului SQL Server. fn cele de mai jos ne yom limita la sintaxa SQL’92, Sintaxa SQL'92: DECLARE nume_cursor { INSENSITIVE }[ SCROLL } CURSOR FOR fiz select TOR ( READ ONLY /UPDATE [ OF mume!coloand,n}})] ‘nume_cursor ~ este numele cursorului: INSENSITIVE ~ defineste un cursor care creeazi 0 copie temporaria setului de tuple corespunzitor. Modificirile ulterioare asupea datelor originale nu sunt reflectate fn datele din cursor. Sunt ine terzise operatile de actualizare. Daca este omist opiinea INSENSITIVE, atunci modificarle din tabelcle de bazt se vor reffecta la nivelul cursorului SCROLL ~ indica faptul cf toate optiunile de navigare-accesare date (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) sunt permise. In lipsa acestei optiuni, NEXTT este singura optiune de navigare permist Frazd_select— definestesetul de tuple corespunztor cursorulu; READ ONLY — interzice operatiile de actualizare date Ia nivelul ‘cursorului; UPDATE [ OF mume_coloand [ , » J] ~ indict coloanele care pot fi modificate tn cursor. Numai coloanele specificate in liste OF ‘nume-coloant{ yn] pot fi modificate. Dack aceasta ist lipseste, ‘atunci, implicit, toate coloanele sunt modificabile, 12.2. Instructiunea OPEN Deschide wn cursor si populeazA cursorul prin executarea fazei SELECT specificaté tn declarata cursorulu Sintaxa: OPEN ( { mume_cursor | nume_variabilts cursor} unde: nume_cursor ~ este numele unui cursor declerat anterior; ‘rume_variabild_cursor - este numele unei vatiabile de tip cursor cere refera cursorul. Observatic: Dupa deschiderea unui cursor variabila sistem @ @CURSOR_ROWS confine numeral de tuple incdrcate de ultima operafie OPEN, 12.3, Instructiunea FETCH Acceseazii o tupla dintr-un cursor gi Mucarc& continutul acesteia intr-un ‘set de variabile, Sintaxa: FETCH [ [NEXT | PRIORI FIRST| LAST TABSOLUTE {m1 @nvar} IRELATIVE (n! @nvar) 1 FROM q { (nue cursor} nume_variabi cursor) {INTO @mume verihila {yn 1} NEXT ~ mut8 pozitia curenté 1a tupla urmatoare $i incarcé continutul ‘acesteia. Daci FETCH NEXT este prima operatie de incarcare a lunui cursor, atunci va incirca prima tuplt @ cursorului. NEXT este optiunea implicita de incarcare, PRIOR - muti pozita curenté la tupla precedents si tnearc8 confinutul acestcia, Dac FETCH PRIOR este prima operatie dé incdrcare unui cursor tune! nu se neared nimic si cursorul rimfine pozi- tionat pe prima tpl. FIRST - muta pozitia curentt la prima tupl& si incare8 confinutul aces- LAST - mutt pozitia curenta la ultima tupla si incatcd confinutul aces- tela ABSOLUTE (1 | @nvar} - pozitionare absoluth pe tupla din pozitia n sau @nvar de la inceput daca n sau @nvar este pozitiv. Daca n sau @nvar este negativ pozitionarea se face fafi de sfarsitul ccursorului (valoarea “1 pozitioneaza pe ultima tupla din cursor!). Dacin sau @nvar este O nu se incared nimic. RELATIVE (n | @nvar} - pozitionare relativa fai de tupla curent®. Cu sm say @nvar avand valoarea 0 se facarca tupla curentl, valoarea \ corespunde optiunii NEXT, iar —1 corespunde optiunii PRIOR. ‘nume_cersor - este numele unui cursor declarat anterior. ‘mume_vartabild_cursor ~ este numete unei variabile de tip cursor care va referi cursorul INTO @nume_variabita [ ,n ]- permite inedrcarea conginutului tuplei curente Tatr-un set de variabile locale. Fiecare variabilt din Tistt este asociati, in ordine, cfte unui atribut din relafia cu care s-a {nclreat cursorul. Corespondenta trebuie s& fie unu la unu ca nu- mar si ca tip de dat& pana la nivelul conversitlor implicite suportate de SQL Server. Observati Variabila de sistem @@FETCH_STATUS indic& modul in care s-a desfagurat ultima operafie FETCH executat’, 12.4, Variabila sistem @ @FETCH_STATUS Returneaz& starea ultimei operatii FETCH executaté asupra unui cursor. ‘Valorile posibile ale variabilei @@FETCH. STATUS si semnificatia acestora este datf fn urmitorul tabel: Tastructnes FETCH a eguat sau cursor in] J faa sti ez, st ptt neice Observatit: I. Deoarecé @@FETCH_STATUS este o variabila global testarca sa trebuie ficuts imediat dupa operatia a c&rei stare vrem so afiim, m” inaintea oricdrei alte operatii FETCH care modifica la randul ei variabila @@FRTCH. STATUS. 2. Variabila @@FETCH_STATUS poate avea valoarea ~2 in cazul unui cursor fara optiunea INSENSITIVE, daca fotre timp un utiliza- tor concurent a"sters tupla pe care s-a Tncercat pozitionatea prin ultima operatie FETCH. 12.5. Instructiunea CLOSE Inchide un cursor deschis si elibereazA setul rezultat asociat. Un cursor Inchis poate fi redeschis din now printr-o instrucjiune OPEN eare calculeaz’ 0 ‘noua valoare actualizatf a setului rezultat. Instrucjiunea CLOSE se poate cexecuta numai asupra unui cursor deschis, Sintax: CLOSE { { nume_cursor } | nume_variabila_ cursor) unde: rnume_cursor - este numele unui cursor declarat anterior; ‘mume_variabil®_cursor - este numele unei variabile de tip cursor care referd cursorul 12.6. Instructiunea DEALLOCATE ‘Sterge o referings Ja un cursor. La stergerea ultimel referinte cétre un ‘cursor foate structurile de date gi resursele asociate cursorului vor fi eliberate, Sintaxa: DEALLOCATE { ( nume_cursor ) | mume_variabila_cursor) unde: ‘nume_cursor - este numele unui cursor declarat anteri ‘mume_vartabild_cursor - este numele unei vatiabile de tip cutsor care Fefera cursorul, Observati 1. Instructiunes DEALLOCATE elimind asocierea dintre un cursor gi hhumele siu sau variabila cursor care refer cursorul. Dac nomele 178 ‘cursor sau variabita este singura care referd cursorul, atunci cursorul este dealocat si toate resursele folosite de acesta sunt eliberate. 2. Ovariabila cursor poate fi asociati cu un cursor in dowk moduri a. Prin atribuirea unui nume cursor unei variabile cursor. De exemplu: DECLARE @cursor_furnizor CURSOR DECLARE cursor furnizor CURSOR FOR SELECT * FROM Purnizor Ser goureor_turnizor~ cursor turnlzor b. Prin asocierea unei definitii de cursor direct unei variabile ‘cursor. De exemplu: DECLARE Goursor_furnizor CURSOR SEP @cursor_furnizor= CURSOR FOR SELECT * FROM Furnizor 3. Un cursor este menginut gi se transmite de Ia un batch la altel (sa de lao procedura la altal) pana la inchiderea si dealocarea sa. in schimb o variabilé cursor exist doar in bateh-ul tn care a fost creat 51 dispare la terminarea acesteia. 12.7. Exemple de utilizare a cursoarelor 1. Secventa de mai jos foloseste un cursor pentru a accesa, pe rind, fiecare furnizor cu scopal de a wimite acestora efte un email DECLARE @itune varchar (20) DECLARE @oras varchar (20) DECLARE curser furnizor CURSOR FOR SELECT Nune,Oras FROM Furntzor oven cursor_furnizor PETCH Nex? FROM cursor_furnizor INTO GNune, eoras WEILE @eeETCH_sTATUS BEGIN EXEC Send_email @Nune,@0ras —yroceduastocetacareralizeaza ~trimitrea unui email, FETCH NEX? FROM cursor_furntzor 1890 @iune, #0ras =D (close cursor_furnizor DEALLOCATE cirsor_furnizor so 2. Urmiitoarea secventi afigeaz’ numele furnizorilor fn ordinea inversii a aparitiei lor fizice in tabela fumnizor. De remarcat ci setul rezultat 179 napa ae ae eee ree eee ee folostea umalt este parcus de In coada In cap, coun ce impune {losirea unui cursor cu optiunea SCROLL. PRIWT ‘Nunele furnizorului eaes FETCH PRIOR FROM cursor turenes, =xD CLOSE cursor furntzor TE cursor_fumtzor “sexe HO @tume Operatia implementatt de secventa de cod de la exemplul 1 ar putea fi wai ales dact numarul furnizorilor este mare Sntre GREE Pmoceoune wesaje(sprima int ovreur) as ‘@Mune varchar(30) @ @oras varenar(30) BARE cursor furnizer CURSOR SCROLL, FOR SELECT Mune, Oras FROM Purn{zor cursor_furnizor ABSOLUTE Spriaml PROM cursor_furnizor’ WTO @Nume, aoxas GoretCH_sraruseo AES Send_ensii eMune,@oxas —proedira scat care realiseum “imiteea enema! SEP Sprimt=epriml+1 erCH NXT PROM cursor furntzor 10 Gime, coras cursor_furnizor dls mai ous ar poate fi lansaté si menfinutd permanent in printr-o secventt de forma: DECLARE @deia int SEP Sdela= wre 1-1 BEGIN BXEC Mesaje Gaela ourur END {in acest mod, cel putin tn Principiu, orice nou furnizor poate prim rodent et Inegisrarea sain tabela Furizor (dest nw Caen ‘modalitate pre eficientt. de rezolvae a acestel problenne!\ Procedura de mai jos trimite un email de atonjionare fiectrul farnizor entru fiecare produs pe care acesta nu il ofera DECLARE Cod? int DECHARE Gime varchar (30) DECLARE @Oras varchar (30) DECLARE furnizor CURSOR FOR SELECT * FROM Furnizor DECLARE produs SCROLL CURSOW FOR SELECT CoaP FROM Produs OPEN furnizor OPEN produs FEFCH FROM furnizer NTO @CodP, éNune,eoras WHILE QGFETCH_staTUS = 0 EOIN FETCH FIRS? PROM produs THT0 écoa? Witte Gerencu_sratus = 0 BECIN AF Nor Exr59S (SELECT + Pow oferte WERE CodP*8CodF AND CodP=eCodP) EXEC Send_enail oMune, cores FETCH NEK? PROM produs INTO cod? PEICH FROM furnizor INTO ecéar,@xme, ores nD CLOSE furntzor Close produs DERLLOCATE: furnizor DEALLOCATE produs @ Observatie: Procedura Atenjionare ia in considerare fiecare pereche posibild de furnizor-produs. Pentru acesta cursorul produs trebuie readus la prima Dozitie pentru fiecare furnizor, ceea ce impune ca acesta si fie declarat cu optiunea SCROLL, Procedura de mai jos realizeazi popularea cu date de test a orictreia dintre tabelele Oferte ori Cereri in functie de valoarea parametrului @Type. Popularea trebuie sa fina cont de contrangerile de cheie string ‘existente intre tabla Oferte gi Furnizor, respectiv Produs. Se yewereazl cite © oferti (cerere) pentru fiecare pereche posibilt de furnizor (beneficiar)-produs, folosindu-se aceleasi valori pentru atributele can tate $i pref. De remarcat c& procedura poate fi usor extinsa pentru a implementa scenarii mai realiste de populare a tabelelor (de exemplu Prin preluarea interactiva a valorilor pentru cantitate si pret pentru fiecare oferti in part!) @Pret money) as DECLARE @CoaA int DECLARE @Cod? int IF @typo='Orerts: DECLARE agent CURSOR FOR SELECT Cod? FROM Furnizor ELSE IF @type='cereri DECLARE agent CURSOR FOR SELECT Cod FROM Beneficiar PRIN? ‘Tip agent itegai! RETURN DECLARE produs SCROLL CURSOR FOR SELECT CodP PROM Produs open agent OPEN produs PETCH FROM agent 170 acoaa, wazLe eerErcH_stamus ~ 0 35ST FETCH FIRST FROM produs THT 8CodP WHILE G@PETcKsnATUS = 0 IP erypo='oferte! INOERT Oferte VALUES (@Codh, @CodP, cant, @Pret) LSE INSERT Cereri VALUES (6CodA,8CodP, €Cant, Pret) PRICH NEX? FROM produs INTO ecodP oy fp THTCH FRO! agent mwT0 ecoda (chose agent CLOSE produs DERLLOCATE agent. DERLLOCATE produs 12.8. Exercitii si probleme om Cum ar trebni modifieatt procedura Mesaje de la exemplul 3 pentru a rispunde situatiilor in care are loc o eXdere a sistemulul in timpul execuiei procedurii? Se doreste ca trimiterea mesajelor si poatd fi rreluata incepdnd cu primul furnizor care mu a primit un mesaj. SA se modifice procedura Populare_Oferte_Cereri de la exemphul 5 astfel incat si nu se folosesci opfiunea SCROLL pentru cursorul produs. SA se scrie o procedurd pentru popularea tabelei Tranzactit, Sii se scrie o procedura si o secvent de apel prin care si se realizeze monitorizarea tranzacjilor din tabela Tranzacti (se va afiga ‘mesaj la inregistrarea unei nof tranzactii!). Fie 0 proceduri definitt astfel: CREATE PROCEQURE Tost AS DECLARE cursor furnizor CURSOR POR SELECT * FROM Furnizor opm cursor_furnizor FETCH PROM cursor _furndzor © si urmitoarea seeven(i de instructiuni: EXEC Test PEICH FROM cursor furn{ zor FETCH FROM cursor_furnizor Explicafi ce se intAmpli Ia execuyia secvenfei de instrucfiuni de mai sus, 13. TRIGGERE ‘Trigerele sunt © clas special de proceduti stocate, asociate unei Uibel, definite pentru afi lansste i execute automat ia infer une oper 6: tp UPDATE, INSERT sau DELETE asupra tbelei tn caved. Trigporee {un un instrument puternic pentru implementarea a ceea ce in aplicaile de baze de date poartd numele de business rules. Termenul se refera lk accle Feguli; in general constringeri, care {in in mod inerent de structura bazei de drs i sunt induse de semantica unei colectii de date, find comune. tetmes Aplicailor care folosesc aceea bazt de date gi relativ independente de fesse Aaplicaie fh parte, Triggereleextind posiblitiile ator instramente de veriisare _ A interitii dio SQL Server cum arf constnger, valor implicte Wi reeel Totusi, aceste instrumente declarative vor fi preférate th locultriggercior ont de te of este posibl Exemple tipice de utilizare a triggeretor sunt * Cascadarea operajilor de modificare de la tabela curentt la alte tabele din baza de date. De exempl, stergerea unui furnizor implica stergerea ofertelor sale din tabela Oferte * Anularea modifictrilor care ar duce la violarea integrtati referen- {iale. Se pot folosi triggerele ca mijloace alternative, eventual mai Sofisticate, la instrumentele de tip declarativ cum ar fi declaraile de cheie strain, * Exprimarea unor constringeri mai complexe care nu pot fi exprimate sub forma unor constringeri de tip CHECK. De ‘exemplu, pentru a goranta unicitatea numelui furnizor in tabela Fumizor nu se poate folosi o simpla declaratie de constringere de tip CHECK. (in acest caz sar putea folosi un index de tip ‘UNIQUE, dar acesta nu rezolva problema unor mesaje pecializate cae i ofere detalii despre natura erori care a apdrut) Alt exempia de constringere complext, implementabil prin triggere ar putea fi aceea ca in fiecare oras i existe cel mule 10 furnizori Un trigger este initiat ori de ofte ori se incearc& operatia de modifieare unzatoare asupra tabelei careia fi este atagat. Un trigger poate contine ejiuni SQL. complexe si poste accesa datele din alte tabele. Trigger $i fia care il declangeaz4 sunt considerate ea un tot unitar(tzactie) ceva ce ind cH dact executiatriggerului egueaz4, dintr-un motiv sau altul, atunci ‘operatia care a declansat triggerul se anuleaza. O tabelA poate avea asociate tule triggere. Instrucfiunes CREATE TRIGGER poate fi definita ca cricare dintre clauzele FOR UPDATE, FOR INSERT sau FOR DELETE Pentru a crea triggere specializate pentru fiecare tip de modificare a uneitabele. Daca se foloseste clauza FOR UPDATE, atunci se poste de ascmenea folos clauza IF UPDATE (nuime_coloana) prin care se poate crea un Uigger specializat pentr situatia modificdri unei coloane anume, Clauza TF UPDATE (nume_coloana) este de fap un test care retumea7A valoarea logied TRUE dsc coloana dat& ca parametru a fost modificatt de operatia care a declangat triggerul si FALSE in caz contrat. SQL Server permite asocierea la 0 singurl tabeld a mai multe triggere deacelasi tip (UPDATE, INSERT sau DELETE). ‘Triggerele cxistente in SQL Server (pin Ia versiunea 7.0 inclusiy) sunt 4e tip post (AFTER), ceea ce inseamn& c& instructiunile din compul gael ajung sa fie executate la terminarea operajei care a declansat trigger. In SQL. Server 2000 sau introdus triggerele INSTEAD OF al ctror cod se executa in locul operatiei care a initia triggerul. 13.1. Instructiunea CREATE TRIGGER Creeaz’ un trigger, atasat unei anumite tabele pentru a fi executat Ia rea unui anumit tip de operafie de modificare a tabelei Sintaxa: CREATE TRIGGER nume trigger ON (tabelalvedere) (WITH ENCRYPTION] i ( (FOR | AFTER INSTEAD OF ) { (DELETE () (INSERT) () [UPDATE] ) (NOT FOR REPLICATION) As ‘instructune_sql{..) } (FOR { (INSERT) (3 [UPDATE] } {NOT FOR REPLICATION) as { IF UPDATE (coloana) [ANDI OR) UPDATE (coloana)) {..n} HIF (COLUMNS_UPDATEDO {operator bit) ‘masca_modifcare) (operator comparare) masca.sest (1) 1 Instructiune sgt.) 1 ) 185 tigger_name - este numele triggerului. Optional se poate specifica nu- ‘mele proprietarului triggerului. tabelalvedere - este numele tabelei sau a vederii cateia i se atajeazt ‘riggerul (nu poate fi un nume de vedere in cazul optiunit AFTER). Opyional se poate specifica numele proprietarului tabelei, WITH ENCRYPTION - triggerul este invegistrat cu textul in forma Tncriptatt AFTER - specifict faptul ca triggerul se executt a terminarea operatici care @ activat triggerul. Optiunea a fost introdustt incepind cu versiunea SQL Server 2000 pentru a face distinctie fafA de triggerele INSTEAD OF, AFTER este optiunea implicitt atunci cfind FOR este singurul cuvant cheie specificat. ‘Triggerele AFTER nu se pot ataga vederilor. INSTEAD. OF - specifica faprul c& triggerul se execu tn locul instruc- ‘uni SQL care a activat triggerul, substituindu-se acesteia. Cel ‘mult un singur tigger INSTEAD OF pentru fiecare tip de operatic INSERT, UPDATE sau DELETE poate fi alagat unt tabele sau vederi. Tous, este posibil si definim vederi pe baza altor vederi si fiecare vedere poate avea propriile triggere INSTEAD OF, io { [DELETE] [) {INSERT} (] (UPDATE] } | ( [INSERT] (,) [UPDATE}} - speciticdtipul operatci (operatilor) prin care se sctivenzs triggerul, Trebuie specificat cel putin un tip de ‘operatic sau mai multe operatii separate prin virgule. NOT FOR REPLICATION - indica faptul cf triggerul nu se va activa dack modificarea tabelei are loc ca urmare al unui proces de replicare, AS - marcheaza inceputul corpului triggerului instructune sal speciic8 conditle si atiuniletriggeruui. Un tigger poate contine conditii prin care se specific eriterii suplimentare Pentru executarea actiunilor din corpul triggerului. Triggerele Pot confine orice numlr si orice tip de instructiuni SQL. cu exceptia frazei SELECT. Un trigger are rolul de a face Verifcari si eventual modificari asupra.unei baze de date gi in nici un caz nu trebuie s& retumeze date utilizatorului care La activat. Instrictiunite din corpul unui trigger pot face referire la dows tabele speciale ale SQL Server numite deleted si inserted, “+ deleted 5 inserted sunt tabele logice avind aceeasi structurl cu tabela cAreia fi este alagat triggerul. Tabela deleted confine valorile vechi ale tuplelor asupra carora actioneazd operatia care a declansat triggerul, iar tabela inserted confine valorile noi ale aceloragi tuple. in cazul ‘unui tigger INSTEAD OF atasat unei vederi structura {abelelor deleted si inserted este aceeasi cu a voderi cieia Teste atasattriggerul pentru a regisi valorile noi produse de operatic INSERT sau UPDATE, in tiggeral atagat se va cuplatabela inserted, cu tabela original. Se va fine cont c& la momentul executiei triggeruluitabela originalé contine deja datele inserate sau motificate. IF UPDATE (coloona) - testeazi dact coloana speciticati a fost smodificaté in urma unei operatii INSERT sax UPDATE. Nu este folositt fn cazul operatilor DELETE, Se pot testa mai multe coloane prin aceeagi instructiune IF construindo expresic logicd care confine mai multe clauze UPDATE(coloana). UPDATE(colcana) se poate folosi oriunde in corpal usu trigger va testa daca cel putin una dintre colosnele specificate s-a modificat masca_test - este masca de biti folositi ca referingi in operatia de ccomparare. 187 Observati bserval ee 1 Trggerele sunt adesea folsite ca altemativt pentru a implementa Spat de integrate referential fn baza de date, Desi SQr, Server fer facilitii declarative pentru exprimarea integritagi seferentale, te la cazul restrictionat (pénd la versiunile SQL Sarver 7.0 inclisiv nu se poate opta pentru sergri eascadete) sh imai mult, sunt limitate la tabelele bazei de date eurente, f8ra af Posibilt exprimarea de leghturi referentate intr tabele din bees de date diferite 2. Orice constringere referitoae la tabela crea i este atagat un trigger SE verficati inate de execuiatiggerului. De aceea orice operat. a 0 constréngere de cheie primar sau cheie straiva este Teuins 5 implicit trigger asociat nu se va activa Din acest moti, daca se doreste implementarea unei constrangeri de inegrtate ‘eferentialé in variantd cascadath prin folosirea unui trigger, este necesar si se stearga ori st se dezactiveze declaratia de cheie strand pe care o inlocuieste 13.2. Instructiunea DROP TRIGGER Serge una sau mai multe triggere din baza de date curenta Sintaxa: DROP TRIGGER (nume_tvigger) {,n] ‘nume_trigger - este numele triggerului care se sterge. Un trigger poate fi strs fie print-o operat explicit de stergere trigger care refer triggerul in cauza, fe implicit prin stergerea tabelei cares i este asociat acesta, Pentru a redenumi un trigger acesta trebuie tnt ters gi apol recreat cu noul mume (combinatic DROP TRIGGER si CREATE TRIGGER). Pentru a modifica definitia unui tigger se poate folosi instructiunea ALTER TRIGGER a carci sintaxt este similard instructiunii CREATE TRIGGER, 13.3. Proprietafi ale triggerelor i Jostructianea CREATE TRIGGER trebuic s8 fie prima tnraun bath si se aplica unei singure tabele, Desi un trigger poate si fac referee la obiecte din afara bazei de date Curente, el poate fi creat nummai in baza de date curenta, Acelasi trigger poate fi asociat cu mai multe tipuri de actuni asupra nei tubele; practic orice combinatie dintre INSERT, DELETE si UPDATE este permisa, Grice operatic de tip SET poate fi specificata in corpul unui trigger. Setirile ramén valabile pana la iesirea din trigger dupa care revin la valorile initiate. La execotarea unui trigger se pot returna rezultate la fel ca in cazul pro- ‘cedurilor stocatc. Acest lucru este, de regulf, nedorit fn aplicati de acea ‘webuie evitate frazele SELECT sau atribuirile de vatiabile prin instruc. fiunea SET. Orice trigger care contine una dintre aceste tipuri de instructiuni necesit& un tratament special in fiecare aplicatie care ar putea activa tiggerul. Prin instructiunea SET NOCOUNT plasath Ja ‘inceputul triggerului se poate evita returnarea de cdtre trigger a orictrei rezulat. Un trigger AFTER nu se poate asocia unei vederi, O instructiune TRUNCATE TABLE nu activeaza eventualele triggere de tip DELETE asociate tabelei curente. Similar instructiunea WRITETEXT nu activesz’ triggerele. Urmatoarele instructiur sunt interzise th corpul unui trigger: ALTER DATABASE — ALTERPROCEDURE ALTER TABLE ALTER TRIGGER ALTER VIEW CREATE DATABASE CREATE DEFAULT CREATE INDEX (CREATE PROCEDURE (CREATE RULE CREATE SCHEMA CREATE TABLE. CREATE TRIGGER CREATE VIEW DENY DISK INIT DISK RESIZE. DROP DATABASE. DROP DEFAULT DROP INDEX DROP PROCEDURE, DROP RULE DROP TABLE DROP TRIGGER DROP VIEW GRANT. LOAD DATABASE LOAD LOG RESTORE DATABASE RESTORE LOG REVOKE RECONFIGURE ‘TRUNCATE TABLE UPDATE STATISTICS 13.4. Triggere multiple SQL Server permite creearea a mai multe triggere, cu name diferite, Pentru acelasi tip de operatie (DELETE, INSERT sau UPDATE) i acelaji ‘abel. Orice trigger ereat cu un nume diferit de cele existente (pentru un tip de ‘operatic si 0 tabelt) se adaugi la acestea. Dact se inceare& crearea unui trigger cu un nume care exist deja, atunci se produce o eroate. 13.5. Triggere recursive SQL Server permite apelul recursiv al triggerelor cu conditia ca 1ea de sistem corespunziitoare st fie activatl, {In acest caz pot i apart dous tipuri de recursivitate: © Recursivitate indirect Este cezul tn care reactivarea triggerului curent se face prin intermedi! altui trigger. © Recursivitate directa Este cazul fn care reactivarea triggerului curent se datoreaza ‘modificarilor pe care el fnsusi le face in baza de date. fn cazul recursivitati indirecte, 0 aplicatie care modific& tabela TL activeazi triggerul TRI, acesta modifica tabela T2 si activeazA triggerul TR2 La rindol lui tiggerul TR2 actualizeaza tabela TH si activeazd iar! triggerul TRI. Pentru recursvitatea directa scenariultipic este urmatorul: 0 aplicatie modifica tabela TI si activeazt tiggerul TRI, care modifica chiar el tabela ‘T, ceea ce reactiveaza triggerul TRI §.a.m.d. Observati 1 Tabelele inserted si deleted pentru un anumit trigger contin, chiar si ‘in cazul apelurilor recursive, numai acele tuple care corespund con, itor din instructiunea UPDATE care a initiat apeluriletriggerctor, 2 Nu existi nici o ordine predefiniti pentru execufia triggerelor tnultiple corespunzitoare aceluiasi eveniment. Din acest motiv fe cate tigger trebuie s& fie independent din punct de vedere logi, inc ‘actiunile cumulate ale triggerelor multiple nu trebuie s& depiod de crdinca fa cate sunt executate. In versiunea SQL Server 2000 exist Posibilitatea de a influenta partial ordinea de executic a triggerclor 190 multiple prin specificarea triggerului care si se execute primul sifsau a celui care se executi ultimul (vezi procedura stocata sp_settriggerorder). 13.6. Triggere imbricate Implicit, SQL Server permite apelurile imbricate de triggere (recursiv sau nu) pind la 32 nivele de adancime, Prin aceasta limitare se garanteazi faptul ef fa cazul unui lant, potential infinit, de apeluri recursive acesta va fi terminat prin interventia sistemului in momentul depi maxim admis, Prin setarea corespunzitoare a optiunilor de sistem se poate bloca propagarea activarilor de triggere prin intermediul altor trigger. Exempla: Presupunem ci am definit tiggere pentru cascadarea stergerilor pe tabelele Furnizor si Oferte,astfel incdt stergerea unui furnizor determina stergerea ofertelor, iar stergerea unei oferte determind stergerca tranzactiilor corespunzatoare. In modul de Iucru implicit, eu facilitatea de imbricare a triggerelor activata, prin cele doua triggere de mai sus se obfine efectul stergerii tuturor ofertelor si tranzactilor unui furnizor atunci cfnd acesta este sters din tabela Furnizor, Daca se dezactiveaz optiunea de imbricare a triggerelor, atunci la stergerea unui furnizor se va activa numai triggerul de stergere a ofertelor, iar tranzactiile raman neafectate. O varianta care rezolv’ problema fa acest caz, este aceea de a projecta triggerul atasat tabelei Furnizor astfel ca la stergerea unui furnizor s8 stearga atét ofertele, oft si tranzactiile acestuia. Bineinjeles cc& se va pastra si triggerul atasat tabelei Oferte prin care se asigurd stergerea tranzacfiiloratunci c&nd are loe stergetea unei oferte. 13.7. Exemple de utilizare a triggerelor Exemplu 1; Triggerul de mai jos afigeazi un mesaj Ia terminarea cu succes a tunei operatii de inserare furnizor. Triggerul se va activa doar ‘daca operatia de inserare nu violeaza nici una dintre eonditiile de integritate ale bazei de dat. IF EXISTS (SELECT name PROM sysobjects WHERE nae = “inserat_turnizor’ AND type DROP TRIGGER inserat furnizor co CREATE TRIGGER inserat_furnizor 191 vali: OW Purnizor Por INSERT AS PRINT ‘Purnizor ingerat cu succes! 0 Hxemplu 2: Campul Nume din tabela Furnizor mu este definit ca si cheie primar. Totusi, dorim ca acesta s& fie cheie candidata in tabela Furizor, adic& numele de furnizor trebuie si fie unice. Acest {ucru poate fi obfinut prin crearea unui index unic peste atributal Nume din tabela Fumizor. Dack nu dorim acest ucra si, eventual, vrem s% implementim un comportament specializat al folosim un trigger atagat tabelei Furnizor, activat prin instruc tiunea INSERT cau UPDATE. IF EKISTS (SELECT name FROM sysobjects WHERE name = ‘furnizorunse' AND type = ‘TR*) DROP TRIGGER fUrnizor nic r) CREATE TRIGGER furnizor_unic ON Furnizor FOR INSERT, UpDAME aS IF EXISTS (SELECT * FROM Purnizor, inserted WHERE Purnizor.codP<>inserted. Code AND Furnizor.thime-ingerted.Wume) porn ~ docs exalt fmizor ev acts name RAISERROR {‘meista deja furnizor cu acest mune! ', 16,2) ROLLBACK TRANSACTION anal inser urnizne xo ELSE PROV? ‘Furnizor inserat cu succes! . In momentul executaiitriggerulu, furnizoriiinserai prin instruc- tinea INSERT sau UPDATE care a actvat trigger se gaseso deja in tabela Furnizor. . Prin instructiunea ROLLBACK TRANSACTION se anuleaz’ att efectele triggerului, oft si ale instructiunii INSERT sau UPDATE care a activattriggetul. De remarcat c@ triggerul de mai sus functioneaza corect att fn cazul operatiilor de inserare sau modificare simpla, ct si in exzul celor multiple, Exempla 3: © consiringere de tip CHECK poate face referire numai la oloana sat tabela pentru care este definiti. Din acest motiv declaratiile CHECK nu se pot folosi pentru a exprima const gti fntre mai multe coloane sau iulre tabele diferite. in aceste ‘cazuri se pot folosi triggerele. ‘Triggerul de mai jos verific& pentru fiecare tranzactie inserat& sau ‘modificatd tn tabela Tranzacfii dac& pretul de tranzactionare este fntre pretul ofertei si cel al ceterii. Tranzactlle care nu respects Aceasti conditie nu vor fi inserate, ori modificarea va fi refuzati, 4i8e va afign un mesaj corespunzator eu valorile celor tei preturi, IF EXISTS (SELECT nane FROM sysobjects WHERE none = "pret_tranzactia® AND type = “™R') DROP TRIGGER prat_traneactie 0 CREATE TRIGGER pret_tranzactie OW tranzactis FOR TNSERD, UPDATE AS DECLARE Grows int DECLARE @pret_tranzactie money DECLARE @pret_oferta noney DECLARE @pret_cerere money DECLARE @nesaj varchar (255) SEP Growe=darqwcount TF (Grows=0) RETURN daca nus-a modifica mic srevine IP UPDATE (Pret) ~inergi ma depart ume daca Eom modifica pret TE (@rows!=1) al multe ple madificate? ‘BEGTH ROLLBACK TRANSACTION — —rejecteara mouificaile multiple RETORN Ex SELECT pret_tranzactieuTrancactii.pret PROW tranzactii, inserted wuss Tranzactii .codf=inserted.coar SELECT Opret_oferta-Oferte.Pret FROM Oferto, inserted WERE Oforte.CodP-insertoa. coer AND Oferce.CodP=ineexted.CodP PROM Cereri, inserted WHERE Cereri .cods=in: AND Cereri Cod IF NOT (Gprat_tranzactie RETWEDY dprat_corers AND Gpret_oferta) Protul de tranzactie='+ ‘couvERr (varchar (10), epret_transactie) Observati 194 . Testul IF UPDATE(Pret) se poate fatocui prin: inesaj+' na este intre pret cereren'+ CONVENE (varchar (10), @pret_cerere) neat’ ai pret ofertas'+ CONVERT (vexchax (10) ,Opret_oferta) RATSERROR (@nosa3,16,1) ROLLBACK TRANSACTION =D Variable sistem @rowcount indieX numtrul de tuple afectate de operatia INSERT sau UPDATE care a activat triggerul, Dacd acest fumar este zero (in cazul unui UPDATE eu condijie WHERE eva- luati la FALSE!) triggerul nu face nimic. in eaz contar se testeazt prin claura UPDATE(Pret) dact operatia modifica aributul Pret. De remarcat ca triggerul functioneaza corect numai dact numa de tuple modificat prin operatia initial este cel mult 1. De accea operatile INSERT sau UPDATE multiple sunt rejectate din start, {n cazul unei modificari simple se tree la verificarea constringeri propriu-zse, si anume pretul de tranzacte s fe inte cel de cerere gi cel de oferti. In variabila @mesaj se construieste mesajul de aver- tizare care este afigat in cazulvioliiconditiei mentionate TR (COLUMIS_UPOATED() & 32) = 32 Geoarece Pret este al gaselea cfimp din tabela Tranzacti, iar masca cu valoarea 32 are 1 pe al gaselea bit (de la dreapta Ia stinga). De remarcat ch COLUMNS_UPDATED( poate retuna 0 masci fomati din mai multi octefi: primul octet corespunde cu primele 8 ‘campuri ale tabelei, al doitea cu urmatoarele & 9.2. Clauza COLUMNS_UPDATED( este utila atunci cfind se doreste testarea siniultand a mai multe coloane. lat& cateva exemple: IP (cOLMMMS_OPDATED() & 7) 17 test modifcaecoloanele 1.2513, IP (coumms_oppRTED() “| 7) 17 est modifcare cl pin wna din ~eoloanele 12 «203 est maificare coloanee 9,10 11 (adic 12 gi 3 din octetal 2) TP (SUBSTRING (COLUMNS UPDRTED(),2,1)« 7) seat medicare colomele1,238,10, $111 IF ((COLWNS_UPDATED() & 7) = 7 AND (SUBSTRING (COLINNE_UFDATED(},2,1)& 7) = 7) Exemplu 4; Triggerul de mai jos este atasattabelei Oferte si este activat de 0 operatie de tip INSERT simpli sau multipli, Rolul su este de a afiga un mesaj prin care se comunica valoarea totala a ofertelor inserate prin operatia care a initia triggerul IF EXISTS (SELECT name FROM syeobjects WHERE name = 'valoaee_oferte' AND type = ‘"m") bao? TRIGGER valoare oferte CREATE TRIGGER valoare_oferte of Oferte FOR INSERT AS DECLARE Brows int DECLARE Btotal_oferte money SEP #rows-Q@roweount IP (Brows=0) RETURN daca nu nserat imi 6 evine SELECT Gtotal_ofertessUM(CantitatePret) FROM inserted PRINT 'Valoarea totala a ofertelor introduse este:'+ (CONVERT (varchar (10) , etotal_oferte) co Observatie: Triggerul valoare_oferte functioneaza corect gi in eazul unei operat d inserare multipla de forma: INSERT Oferte SELECT ...! De reinut & activarea gi executiatriggerufui are loc singurd dati pontra inireaga, operatie de inserare si nu penta fiecare tpl fn pate Exemplu 5: Orice trigger din SQL Server are acces la dau tabele temporare, rezidente To memorie numite: deleted si inserted. Datele dinf aceste tabele nu pot fi modificate, dar pot fi folosite penta testa cefectul operatitor care au intiattriggerele, pentru conditii de ‘executare a diverse operatié din cadrul triggerelor si pentru a face} discriminare tre difertele tipuri de operatii (DELETE, INSERT sau UPDATE) care pot declansa un trigger Tabela deleted confine copiile tuplelor afectate de o instructiune DELETE sau UPDATE. in timpul executici unei asemenca| operatii tuplele afectate sunt sterse din tabela asociata si transferate in tabela deleted. in mod normal, tabela asociats $i tabela deleted nu vor avea nici o tupla in comun. in cazul unei{ coperatii INSERT tabela deleted va fi vida, Tabela inserted confine copile tuplelor aectate deo instructiune INSERT sau UPDATE. In timpul execute! unei asemenca operat tuplele noi sunt adugate simultan atét tn tabela inserted, 195 om Purnizor POR INSERT AS PRINT ‘Furnizor inserat cu succes!” @ mpla2: Cimpul Nume din tabela Furnizor nu este definit ea si cheie primard, Totusi, dorim ca acesta sf fie cheie candidata in tabela Furnizor, adici numele de furnizor trebuie s& fie unice, Acest Jucra poate fi obtinut prin crearea unui index unic peste atributal Nume din tabela Furnizor. Dact nu dorim acest lucru $i, eventual, vrem si implementim un comportament specializat al sistemului la orice tentativa de violare a acestei condifii, puter si folosim un trigger atagat tabelei Furnizor, activat prin instruo- fiunca INSERT sau UPDATE. IF EXISTS (SELECT name FROM sysobjects WHERE name = ‘furnizer unic' AND type = ‘R*) DROP TRIGGER furnizor_unie co (CREATE TRIGGER furnizor_unie (ON Furnizor FOR INSERT, UPDATE AS IP EXISTS (SELECT * PROM Purnizor, inserted WHERE Furnizor.CodP<>inserted.coa? [AND Purnizor.Munesinserted. sme) BEGIN daca exist alt funeor en acl RATSERROR (‘gxista deja Furnizor eu acest rune! ", 16) 1) ROLLBACK TRANSACTION ule inser friar ELSE PROV? ‘Furnizor inserat cu eucces!' In momentul executittriggerului, fumizoritinserai prin instruc- tiunea INSERT sau UPDATE car a activa riggeril se gisesc deja In tabla Furnizor. rin instructiunea ROLLBACK TRANSACTION se anuleazi atat ‘efectele triggerului, cft si ale instructiunii INSERT sau UPDATE ccare a activat triggerul. De remarcat c& triggerul de mai sus functioneazA corect atit fn cazul operatiilor de inserare sau modificare simplt, oft gi multiple. fn cazul celor es Exempla 3; O constringere de tip CHECK poate face referire numai la coloana sau tabela pentru care este definiti. Din acest motiv declaratiile CHECK nu se pot folosi pentru a exprima constran- seri intre mai multe coloane sau intre tabele diferite. In aceste cazuri se pot folositriggerele. “Triggerul de mai jos verific& pentru fiecare tranzactie inserata sau ‘modificaté in tabela Tranzacjii dac& preful de tranzactionare este Inte pretul ofertei si cel al ceterii. Tranzacfile care nu respects aceasti conditie nu vor fi inserate, ori modificarea va fi refuzats, i se va afiga un mesaj corespunzator cu valorile celor tei preturi. IP EXISTS (SELECT nane FROM sysobjects WHERE nano = "pret_tranactie' AND type = '7R') DROP TRIGGER prot_tranzactic co CREATE TRIGGER pret_tranzactic ON Trenzactil DECLARE Grows Sint DECLARE @pret_tranzactie money DECLARE Qpret_oferta soney DECLARE @pret_corere money DECLARE @nesaj varchar (255) SET Grows-aerowsount IP (@rowe-0) RETURN daca nu s.a modificat nimi se revine IF UPDATE(Pret) ‘erg mel departe sural daca peor modifi pret TE (Grows ai multe tuple moificate? ROLLBACK TRANSACTION —snjecteara modicaile multiple RETOR a SELECT @pret_trantactiowtranzactii.Pret "FROM Tranzactii, inserted WHERE Tyansactii .cod?=inserted.coot SELBC? pret_ofertaspferte.eret "FROM Oferte, inserted wane Oferte.codr=inserted.coaP ‘AND Oferte CodPsinserted.CoaP Seuscr @pret_cerere-Cereri.Pret FROM Cereri, inserted watts Cereri ,Codb~inaerted.coaa TAND Cereri ,CoaP=inserted.coae IP NOP (@pret_tranznctie BETWEEN @pret_cerere ‘AND epratorerta) ecm ‘SEP Oneaaj='Pretul de tranzactie='+ ‘CONVERT (varchar (1D) , epret_tranzactie) 193 SEF Onesaj=Onesaj+' mu este intre pret cerere: CONVERT (varchar (10), @pret_cerere) SED @nesaj~enenaj+' si pret ofertas'+ CONVER? (varchar (10), apret_oferta) BATSERROR (neva, 26,1) ROLLBACK TRANSACTION Observati 1. Variabila sistem @rowcount indict numfrul de tuple afectate de operatia INSERT sau UPDATE care a activattriggerul. Daca acest hnummar este 2ero Gn cazul unui UPDATE cu conditie WHERE eva- lata la FALSE!) triggerul nu face nimic, In caz contrar se testeaza prin clauza UPDATE(Pret) dac& operatia a modificat atributul Pret. De remarcat c& triggerul functioneaza corect numai dack numérul de ‘tuple modificat prin operatia initial este cel mult 1. De accea gperajiile INSERT sau UPDATE multiple sunt rejectate din star. {n cazul unei modificari simple se trece la verificarea constrangerii propriu-zise, $i anume pretul de tranzactie sd fie intre cel de cerere gi cel de oferta. In variabila @mesaj se construieste mesajul de aver- tizare care este afigat in cazul violitli conditiei mentionate. . Testul IF UPDATE(Pret) se poate fnlocui prin: TP (COLLMNS_UPDATED() & 32) = 32 dcomrece Pret este al saselea cAmp din tabela Tranzactit, iar masca ‘ou valoaren 32 are | pe al saselea bit (de Ia dreapta la stdnga), De remarcat ch COLUMNS_UPDATEDQ poate returna 0 masca fomat& din mai multi octefi: primul octet corespunde cu primele 8 cAmpari ale tabelei, al doilea cu urméitoarele 8 $.a.m.d Clauza COLUMNS_UPDATED() este utilé atunci cfind se doreste testarea simultand a mai multe coloane. lati efteva exemple: 2 (COLUIMS_UPDATED() & 7) = 7 test modificarecoloonele 12513, TF (CoLUIN_VPDATED() "| 7) = 7 —est modifcae ee putin ana oo ~eoloanele 1.2eau3 4est modifies coloanee 9,105 11 (adie 12 si 3 din octet 21) IF (SUBSTRING (CoLms UPDRTED(S,2,3)4.7) = 7 test moire coloanee 1.229.105 11 IF ((COLIMNS_UPOATED() 7) = 7 AND. (SUBSTRING \CoLmaNS_UPDATED(},2.1)& 7) = 7) Exemplu 4: Triggerul de mai jos este atasat tabelei Oferte si este activat de 0 operatie de tip INSERT simpli sau multipls. Rolul siu este de a afiga un mesaj prin care se comunica valoarea totald a ofertelor inserate prin operatia care a imifiattriggerul. IF EXISTS (SELECT nano PROM aysobjects : WHERE nane = ‘valoare_oferte' AND type = ‘TR DROP TRIGGER valoare-oferte co CREATE TRIGGER valoare_oferte ou oferes FOR INSERT AS DECLARE Prowse int DECLARE Btotal_ofete money daca mus insert nmic se eve FROK inserted PRINT *Valoarea totala a ofertelor introduse este: ‘+ CConERT (varchar (10) ,@total_oferte) @ ‘Triggerul valoare_oferte functioneaza corect gi tn cazul unei operatii de inserare multipli de forma: INSERT Oferte SELECT ...! De refinut c& activarea si execufia triggerului are loc o singur& dati pentru fntreaga Coperatie de inserare si nu pentru flecare tuplf fn parte Exempla : Orice trigger din SQL Server are acces la dou tabele temporare, rezidente fn memorie numite: deleted si inserted. Datle din acest tbele mu pot fi modificate, dar pot fi falosite pentru a testa efectul operatilor care au initattrigerele, pentru condi de executare a diverse operatii din cadrul triggerelor si pentru a face diseriminareintre difertele tipuri de. operali (DELETE, INSERT sau UPDATE) care pot declanga un trigger Tabela deleted confine copie tuplelorafetate de oinstrufiune DELETE sau UPDATE. In timpul executed unei asemenca operat tupele afectate sunt sterse din tabela, asoeiatl ot transferate fn tabela deleted. In mod normal, tabela asociata si tabela deleted nu vor avea nici o tuplé tn eomun, In cal unet operatii INSERT tabela deleted va fi vida Tabela inserted contine copiile tupleorafectate de o instructiune INSERT sau UPDATE. In timpul executiei tne asemenca ‘pera tuplele not sunt adhugate simultn atin tabela inserted, eat $i in tabela asociatt. In cazul unei operatii tal inserted va fi vida, aa © operaie UPDATE. poste privit exo gegete ura de i deo inserare.Tupele veoh sunt copa in abla deleted, ole st Inaba ei yt sete tn tigger se poste determina tipul instrctiunit declangatoare as dacd atét inserted, cat si deleted sunt nevide, atunci instructiunea este UPDATE: + dact inserted este vida si deleted nevids, atunci instructiunea este DELETE; ‘+ daci inserted este nevida si deleted vids, etunci instructiunea este INSERT. Triggerul de fa exemplul precedent poate fi extins pentru a informa asupra modificirilor de oferte nu numai la aparitia unot oferte noi, ci si atunci cand, prin incheicrea unor tranzacii, are loc modificarea sau stergerea ofertelorafectate de tranzectie. In Juma unei operatii UPDATE se va afiga nu numa valoarea tran- ~zacfionat, ci si valoarea rimast in cadrul ofertelorafectate IP EXISTS (SELECT nome FROM sysobjects WHERE neme = ‘bilant_oferte' AYD type = “TR') ‘OHOP TRIGGER bilant _oferte 0 ON Oferce ReGIN m0 196 IF WOT EXISTS (SELECT * FROM deleted) IF NOP FXISTS(SELECT * FROM inserted) CREATE TRIGGER bilane _oferte DELETS, UPDATE AS DECLARE Grows int = pernti ese INSERT SELECT @total_oferte_inseratersum(cantitate*Pret) FROM inserted PRINT ‘Vnlonrea totala a ofertelor introduse te CONVERT varchar (10), @total_oferte_inserat RETURN ~ opeatia este DELETE, SELECT @total_oferte_sterse=sum(Cantitate*Pret) Prom deleted PRINT ‘Valoaxea totals a ofertelor sterse este: convent (varchar(10), @total_oferte sterse) Revue ee END aca 5 jun a SELECT Gtotal_oferte.aters {atu operata este UPDATE SUM Cantsta Pret) PROM deleted PRINT *Valaarea tranzactionath este: "+ CONVERT varchar(16), Gtotal_oferte_sterse) SEUECT @total_oferte inserate=3UM|cantitate-Pret) FROM inserted PRINT ‘Valoarea rinaaa este: '+ comvann (varchar (10), @totai_oferte_inserate) Exemplu 6: 0 instructiune INSERT, UPDATE sau DELETE care refer 0 ‘vedere avand atasat un trigger INSTEAD OF declanseaza execu- tarea instrutiuilor din corpul triggerulu fn lcul operate tiale. fn acest caztabelele mnserted si deleted au aceleayi cimperi casi vederea referit Un trigger INSTEAD OF INSERT se stageart nei vederi Pentru a inlocui 0 operate de tip INSERT care face referire la acea vedere. In acest mod se pot defini operai de insrareint-0 vedere care se trade prin insert fa mai multe tabee de baz. Fic vederea Tronzactt: Desfasuratdefinit atl: cenmE. vitie Teansacti_Dosfansrat AS Stuner thune_furnisorsturniser Mone, Oran Furnizee=Purnisor. Oras, at pentiniaer pesedictatmms, Ores Beneticiar= Beneficine. Ore Nine-Prosuss Prodaa. None, Cantitave, Pest rrow surnizer, Benetlelar, Frodus, tranzactii Wun Furaizor.codPs Transactii cod? iO Beneflelar.CodBePransactsi .CodB Aid produ. Codi-tratenct id. Cod? © instructiune INSERT care face referite 1a vederea Tranzactii_Desfasurat poate fi interpretatt in diverse moduri: ‘© se insereaz4 céte 0 tupli tn fiecare dintre tabele Furnizor, Beneficiar, Produs si Tranzactii, se insereazé o tupli doar fn tabela Tranzagjit cu codurile ‘obtinute din tabelele Furnizor, Beneficlar si Produs pe baza valorilor date pentru atributele Nume; ‘© orice varianta intermediars intre cele douk de sus. In oricare dintre variante apar probleme suplimentare de rezolva: © Cesse intémpla daca exist deja un furnizor cu acclasi mume? (la prima variants); 197 * Ce se Ttémplé dact furnizorut mentionat nu existé? (la a

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