Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Procedurat e ruajtura. Krijimi i procedurave të ruajtura në serverin microsoft sql

Konsiderohet një situatë ku procedurat e ruajtura mund të degradojnë performancën e pyetjes.


Gjatë përpilimit të procedurave të ruajtura në MS SQL Server 2000, procedurat e ruajtura vendosen në cache procedurale, të cilat mund të përmirësojnë performancën gjatë ekzekutimit të tyre duke eliminuar nevojën për analizë, optimizim dhe përpilim të kodit të procedurës së ruajtur.
Nga ana tjetër, ka kurthe në ruajtjen e kodit të përpiluar të një procedure të ruajtur që mund të ketë efektin e kundërt.
Fakti është se gjatë përpilimit të një procedure të ruajtur, përpilohet plani i ekzekutimit të atyre operatorëve që përbëjnë kodin e procedurës, përkatësisht, nëse procedura e ruajtur e përpiluar është memorizuar, atëherë plani i ekzekutimit të saj ruhet në memorie, dhe për këtë arsye, procedura e ruajtur nuk do të të jetë i optimizuar për një situatë specifike dhe parametra të pyetjes.
Do të bëjë një eksperiment të vogël për ta demonstruar këtë.

HAPI 1... Krijimi i bazës së të dhënave.
Le të krijojmë një bazë të dhënash të veçantë për eksperimentin.

KRIJO BAZA TË TË DHËNAVE test_sp_perf
ON (EMRI = "Test_data", FILENAME = "c: \ temp \ test_data", SIZE = 1, MAXSIZE = 10, FILEGROWTH = 1 Mb)
LOG ON (EMRI = "test_log", FILENAME = "c: \ temp \ test_log", SIZE = 1, MAXSIZE = 10, FILEGROWTH = 1 Mb)

HAPI 2. Krijimi i një tabele.
KRIJO TABELA sp_perf_test (kolona 1 int, kolona 2 karakter (5000))

HAPI 3. Plotësimi i tabelës me vija testuese. Rreshtat dublikatë janë shtuar qëllimisht në tabelë. 10,000 rreshta numëroheshin nga 1 në 10,000 dhe 10,000 rreshta numëronin 50,000.

DEKLARONI @i int
SET @ i = 1
Nderkohe une<10000)
FILLOJ
INSERT INTO sp_perf_test (kolona 1, kolona 2) VALUES (@i, "Teststring #" + CAST (@i si karakter (8)))
INSERT INTO sp_perf_test (kolona 1, kolona 2) VALUES (50000, "Teststring #" + CAST (@i si karakter (8)))
SET @ i = @ i + 1
FUND

SELECT COUNT (*) NGA sp_perf_test
Shkoni

HAPI 4. Krijo një indeks jo të grupuar. Meqenëse plani i ekzekutimit ruhet në cache me procedurën, indeksi do të përdoret i njëjtë për të gjitha thirrjet.

KRIJO CL_perf_test CL_perf_test PA INDEKSI ON sp_perf_test (kolona 1)
Shkoni

HAPI 5. Krijimi i një procedure të ruajtur. Procedura thjesht ekzekuton një deklaratë SELECT me një kusht.

KRIJO PROC proc1 (@param int)
AS
ZGJIDH kolonën1, kolonën 2 NGA sp_perf_test WHERE [email i mbrojtur]
Shkoni

HAPI 6. Kryerja e një procedure të ruajtur. Kur fillon një procedurë vulnerabël, përdoret posaçërisht një parametër selektiv. Si rezultat i procedurës, marrim 1 rresht. Plani i ekzekutimit tregon përdorimin e një indeksi jo të grupuar sepse pyetja është selektive dhe është mënyra më e mirë për të tërhequr një rresht. Një procedurë e optimizuar për marrjen e një rreshti ruhet në cache procedurale.

EXEC proc1 1234
Shkoni

HAPI 7. Ekzekutimi i një procedure të ruajtur me një parametër jo selektiv. Si parametër përdoret vlera 50,000. Linjat me një vlerë të tillë të kolonës së parë prej rreth 10,000, përkatësisht, duke përdorur një indeks jo të grupuar dhe operacionin e kërkimit të faqerojtësve janë joefektive, por meqenëse kodi i përpiluar me planin e ekzekutimit ruhet në cache procedurale, do të përdoret. Plani i ekzekutimit e tregon këtë, si dhe faktin që operacioni i kërkimit të faqerojtësve është kryer për 9999 rreshta.

EXEC proc1 50,000
Shkoni

HAPI 8. Marrja e rreshtave me fushën e parë të barabartë me 50 000. Ekzekutimi i një pyetësori të veçantë do të optimizojë dhe përpilojë pyetjen me vlerën specifike të kolonës së parë. Si rezultat, optimizuesi i pyetjeve zbulon se fusha është dublikuar shumë herë dhe vendos të përdorë operacionin e skanimit të tabelës, i cili në këtë rast është shumë më efikas sesa përdorimi i një indeksi jo të grumbulluar.

SELECT kolonën1, kolonën 2 FROM sp_perf_test WHERE kolona1 = 50000
Shkoni

Kështu, mund të konkludojmë se përdorimi i procedurave të ruajtura nuk mund të përmirësojë gjithmonë performancën e pyetjes. Duhet të jeni shumë të kujdesshëm në lidhje me procedurat e ruajtura që funksionojnë në rezultate me një numër të ndryshueshëm linjash dhe përdorin plane të ndryshme ekzekutimi.
Ju mund të përdorni skriptin për të përsëritur eksperimentin në një server të ri MS SQL.

procedurë e ruajturështë e mundur vetëm nëse kryhet në kontekstin e bazës së të dhënave ku ndodhet procedura.

Llojet e procedurave të ruajtura

Ekzistojnë disa lloje në SQL Server procedurat e ruajtura.

  • Sistemik procedurat e ruajtura janë krijuar për të kryer veprime të ndryshme administrative. Pothuajse të gjitha veprimet e administrimit të serverit kryhen me ndihmën e tyre. Mund të themi se sistemi procedurat e ruajtura janë një ndërfaqe që ofron punë me tabelat e sistemit, e cila në fund të fundit zbret në ndryshimin, shtimin, fshirjen dhe marrjen e të dhënave nga tabelat e sistemit të bazave të të dhënave të përdoruesve dhe të sistemit. Sistemik procedurat e ruajtura janë të prefiksuara me sp_, ruhen në bazën e të dhënave të sistemit dhe mund të thirren në kontekstin e çdo baze të dhënash tjetër.
  • Me porosi procedurat e ruajtura kryejnë veprime të caktuara. Procedurat e ruajtura- një objekt i plotë i bazës së të dhënave. Si rezultat, secili procedurë e ruajtur ndodhet në një bazë të dhënash specifike, ku edhe ekzekutohet.
  • E përkohshme procedurat e ruajtura ekzistojnë vetëm për ca kohë, pas së cilës ato shkatërrohen automatikisht nga serveri. Ato ndahen në lokale dhe globale. E përkohshme lokale procedurat e ruajtura mund të thirren vetëm nga lidhja në të cilën janë krijuar. Kur krijoni një procedurë të tillë, duhet t'i jepni një emër që fillon me një # karakter të vetëm. Si të gjitha objektet e përkohshme, procedurat e ruajtura të këtij lloji fshihen automatikisht kur përdoruesi shkëput, rinis ose ndalon serverin. E përkohshme globale procedurat e ruajtura në dispozicion për çdo lidhje serveri që ka të njëjtën procedurë. Për ta përcaktuar atë, thjesht duhet t'i jepni një emër duke filluar me simbolet ##. Këto procedura fshihen kur serveri riniset ose ndalet, ose kur lidhja në kontekstin e së cilës janë krijuar mbyllet.

Krijimi, modifikimi dhe fshirja e procedurave të ruajtura

Krijim procedurë e ruajtur përfshin zgjidhjen e detyrave të mëposhtme:

  • duke përcaktuar llojin e krijuar procedurë e ruajtur: i përkohshëm ose me porosi. Përveç kësaj, ju mund të krijoni sistemin tuaj procedurë e ruajtur duke i dhënë një emër të prefiksuar me sp_ dhe duke e vendosur në bazën e të dhënave të sistemit. Kjo procedurë do të jetë e disponueshme në kontekstin e çdo baze të dhënash në serverin lokal;
  • planifikimi i të drejtave të aksesit. Gjatë krijimit procedurë e ruajtur duhet të kihet parasysh se do të ketë të njëjtat të drejta aksesi në objektet e bazës së të dhënave si përdoruesi që e krijoi atë;
  • përkufizim parametrat e procedurës së ruajtur... Ashtu si procedurat që gjenden në shumicën e gjuhëve të programimit, procedurat e ruajtura mund të ketë parametra hyrës dhe dalës;
  • zhvillimi i kodit procedurë e ruajtur... Kodi i procedurës mund të përmbajë një sekuencë të çdo komande SQL, duke përfshirë thirrjet ndaj të tjerëve. procedurat e ruajtura.

Krijimi i një të reje dhe modifikimi i një ekzistues procedurë e ruajtur bëhet me komandën e mëposhtme:

<определение_процедуры>:: = (KRIJO | NDRYSHO) emri_procedurës [; numri] [(@ lloji i të dhënave_emrit të parametrit) [= parazgjedhja]] [, ... n] AS sql_operator [... n]

Le të shqyrtojmë parametrat e kësaj komande.

Duke përdorur prefikset sp_, #, ##, procedura e krijuar mund të përkufizohet si sistem ose e përkohshme. Siç mund ta shihni nga sintaksa e komandës, nuk lejohet të specifikohet emri i pronarit që do të zotërojë procedurën e krijuar, si dhe emrin e bazës së të dhënave ku duhet të vendoset. Kështu, për të vendosur të krijuarit procedurë e ruajtur në një bazë të dhënash specifike, duhet të ekzekutoni komandën CREATE PROCEDURE në kontekstin e asaj baze të dhënash. Gjatë trajtimit jashtë trupit procedurë e ruajtur ju mund të përdorni emra të shkurtuar për objektet e së njëjtës bazë të dhënash, domethënë pa specifikuar emrin e bazës së të dhënave. Kur duhet t'i referoheni objekteve të vendosura në baza të tjera të dhënash, kërkohet të specifikoni emrin e bazës së të dhënave.

Numri në emër është numri i identifikimit procedurë e ruajtur, e cila e identifikon në mënyrë unike në një grup procedurash. Për lehtësinë e menaxhimit të procedurave, logjikisht të të njëjtit lloj procedurat e ruajtura mund të grupohen duke u dhënë të njëjtin emër, por numra të ndryshëm identifikimi.

Për të transferuar të dhëna hyrëse dhe dalëse në të krijuarit procedurë e ruajtur mund të përdoren parametrat, emrat e të cilëve, si emrat e variablave lokale, duhet të fillojnë me simbolin @. Një procedurë e ruajtur mund të specifikohen shumë parametra, të ndarë me presje. Trupi i një procedure nuk duhet të përdorë variabla lokale, emrat e të cilëve janë të njëjtë me emrat e parametrave të kësaj procedure.

Për të përcaktuar llojin e të dhënave që do të ketë përkatëse parametri i procedurës së ruajtur, çdo lloj i të dhënave SQL, duke përfshirë ato të përcaktuara nga përdoruesi, do të funksionojë. Megjithatë, lloji i të dhënave CURSOR mund të përdoret vetëm si parametri i daljes procedurë e ruajtur, d.m.th. duke specifikuar fjalën kyçe OUTPUT.

Prania e fjalës kyçe OUTPUT do të thotë që parametri përkatës synon të kthejë të dhëna nga procedurë e ruajtur... Sidoqoftë, kjo nuk do të thotë aspak se parametri nuk është i përshtatshëm për të kaluar vlerat procedurë e ruajtur... Specifikimi i fjalës kyçe OUTPUT udhëzon serverin të dalë procedurë e ruajtur caktoni vlerën aktuale të parametrit variablit lokal që është specifikuar si vlerë e parametrit kur thirret procedura. Vini re se kur specifikohet fjala kyçe OUTPUT, vlera e parametrit përkatës kur thirret një procedurë mund të vendoset vetëm duke përdorur një ndryshore lokale. Nuk ju lejohet të përdorni shprehje ose konstante që janë të vlefshme për parametrat normalë.

Fjala kyçe VARYING përdoret në lidhje me

Procedurat e ruajtura

Tema e këtij kapitulli është një nga mjetet më të fuqishme që u ofrohet zhvilluesve të aplikacioneve të bazës së të dhënave InterBase për zbatimin e logjikës së biznesit. centralizoni përpunimin e të dhënave dhe zvogëloni sasinë e kodit të kërkuar për të përfunduar detyrat Pothuajse çdo aplikacion mjaft kompleks i bazës së të dhënave kërkon përdorimin e procedurave të ruajtura.
Përveç këtyre avantazheve të njohura të përdorimit të procedurave të ruajtura, të cilat janë të zakonshme për shumicën e DBMS-ve relacionale, procedurat e ruajtura InterBase mund të veprojnë si grupe të dhënash të afërta, gjë që u lejon atyre të përdorin rezultatet që kthejnë në pyetje të rregullta SQL.
Shpesh zhvilluesit fillestar mendojnë për procedurat e ruajtura thjesht si një grup pyetjesh specifike SQL që bëjnë diçka brenda bazës së të dhënave, dhe ekziston një mendim se të punosh me procedurat e ruajtura është shumë më e vështirë sesa zbatimi i të njëjtit funksionalitet në një aplikacion klienti në një nivel të lartë. gjuhe.
Pra, cilat janë procedurat e ruajtura në InterBase?
Një procedurë e ruajtur (SP) është një pjesë e meta të dhënave të bazës së të dhënave, e cila është një nënprogram i përpiluar në përfaqësimin e brendshëm InterBase, i shkruar në një gjuhë të veçantë, përpiluesi i së cilës është i integruar në thelbin e serverit InteiBase.
Procedura e ruajtur mund të thirret nga aplikacionet e klientit, aktivizuesit dhe procedurat e tjera të ruajtura. Një procedurë e ruajtur ekzekutohet brenda procesit të serverit dhe mund të manipulojë të dhënat në bazën e të dhënave, si dhe t'i kthejë rezultatet e ekzekutimit të saj te klienti që e ka thirrur atë (d.m.th., trigger, CP, aplikacion)
Baza e aftësive të fuqishme të natyrshme në PS është një gjuhë programimi procedurale që përfshin të dy deklaratat e modifikuara të SQL-së së zakonshme, të tilla si INSERT, UPDATE dhe SELECT, si dhe mjetet e degëzimit dhe looping (IF, WHILE), si dhe trajtimin e gabimeve. mjetet dhe situatat e jashtëzakonshme Gjuha e procedurave të ruajtura ju lejon të zbatoni algoritme komplekse për të punuar me të dhëna, dhe për shkak të fokusit në punën me të dhënat relacionale, HP janë shumë më kompakte se procedurat e ngjashme në gjuhët tradicionale.
Duhet të theksohet se e njëjta gjuhë programimi përdoret për shkaktarët, me përjashtim të një numri veçorish dhe kufizimesh. Dallimet midis nëngrupit të gjuhës së përdorur në aktivizues dhe gjuhës XPS diskutohen në detaje në kapitullin "Shkaktuesit" (Pjesa 1).

Një shembull i një procedure të thjeshtë të ruajtur

Tani është koha për të krijuar procedurën e parë të ruajtur dhe për ta përdorur atë për të mësuar procesin e krijimit të procedurave të ruajtura. Por së pari, duhen thënë disa fjalë për mënyrën e punës me procedurat e ruajtura. Fakti është se mjetet standarde jashtëzakonisht të dobëta për zhvillimin dhe korrigjimin e procedurave të ruajtura ia detyrojnë lavdinë e tyre veglës së paqartë dhe të papërshtatshme CP. Në dokumentacionin InterBase, rekomandohet të krijohen procedura duke përdorur skedarë skripti SQL që përmbajnë tekstin e CP, të cilat futen në hyrjen e interpretuesit isql, dhe kështu të krijohet dhe modifikohet CP. Nëse ky skript SQL në fazën e përpilimit teksti i procedurës në BLR Nëse ndodh një gabim, isql do të shfaqë një mesazh në cilin rresht të skedarit të skriptit SQL ka ndodhur ky gabim. Korrigjoni gabimin dhe përsërisni përsëri. Korrigjimi në kuptimin modern të fjalës, domethënë gjurmimi i ekzekutimit, me aftësinë për të parë vlerat e ndërmjetme të variablave, nuk është aspak në diskutim. Natyrisht, kjo qasje nuk kontribuon në rritjen e atraktivitetit të procedurave të ruajtura në sytë e zhvilluesit.
Megjithatë, përveç qasjes standarde minimaliste për zhvillimin e HP<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
Sintaksa e procedurës së ruajtur përshkruhet si më poshtë:

Emri CREATE PROCEDURE
[(tipi i të dhënave param [, tipi i të dhënave param ...])]
)]
AS
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
Lloji i të dhënave DEKLARONI VARIABLE var;

=
FILLOJ
< compound_statement>
[< compound_statement> ...]
FUND
< compound_statement> = (deklaratë;)

Duket mjaft voluminoze dhe mund të jetë edhe e rëndë, por në fakt gjithçka është shumë e thjeshtë. Për të zotëruar gradualisht sintaksën, le të shohim shembuj gradualisht më të ndërlikuar.
Pra, këtu është një shembull i një procedure shumë të thjeshtë të ruajtur që merr dy numra si hyrje, i shton ato dhe kthen rezultatin:

KRIJO PROCEDURE SP_Shto (first_arg PRECISION DYFISHT,
second_arg SAKTËSI E DYFISHTË)
KTHIM (Rezultati SAKTËSI E DYFISHT)
AS
FILLOJ
Rezultati = i pari_arg + i dyti_arg;
PEZULLOJ;
FUND

Siç mund ta shihni, gjithçka është e thjeshtë: pas komandës CREATE PROCEDURE, tregohet emri i procedurës së krijuar rishtazi (e cila duhet të jetë unike brenda bazës së të dhënave) - në këtë rast, SP_Add, pastaj parametrat e hyrjes së CP - first_arg dhe second_arg - renditen në kllapa, të ndara me presje, me një tregues të llojeve të tyre.
Lista e parametrave të hyrjes është një pjesë opsionale e deklaratës CREATE PROCEDURE - ka raste kur procedura merr të gjitha të dhënat për funksionimin e saj me anë të pyetjeve në tabelat brenda trupit të procedurës.

Çdo lloj i të dhënave skalar InteiBase përdoret në procedurat e ruajtura Nuk mund të përdoren vargje dhe lloje të përcaktuara nga përdoruesi - domenet

Më pas vjen fjala kyçe RETURNS, pas së cilës parametrat e kthyer renditen në kllapa, duke treguar llojet e tyre - në këtë rast, vetëm një - Rezultat.
Nëse procedura nuk duhet të kthejë parametra, atëherë fjala RETURNS dhe lista e parametrave të kthimit mungojnë.
RETURNSQ pasohet nga fjala kyçe AS. Para se të shkojë fjala kyçe AS titull, dhe pas tij - teko procedurat.
Trupi i një procedure të ruajtur është një listë e përshkrimeve të variablave të saj të brendshëm (lokalë) (nëse ka, do t'i diskutojmë më në detaje më poshtë), të ndara me një pikëpresje (;) dhe një bllok deklaratash të mbyllura në kllapat e operatorit FILLO FUND. Në këtë rast, trupi i SP është shumë i thjeshtë - ne kërkojmë të shtojmë dy argumente hyrëse dhe të caktojmë rezultatin e tyre në dalje, dhe më pas të thërrasim komandën SUSPEND. Pak më vonë, ne do të shpjegojmë thelbin e funksionimit të kësaj komande, por tani për tani thjesht do të vërejmë se është e nevojshme të kaloni parametrat e kthyer atje ku u thirr procedura e ruajtur.

Ndarësit në procedurat e ruajtura

Vini re se një deklaratë brenda një procedure përfundon me një pikëpresje (;). Siç e dini, pikëpresja është ndarësi standard i komandës në SQL - është një sinjal për interpretuesin SQL që teksti i komandës është futur plotësisht dhe është e nevojshme të filloni përpunimin e tij. A mund të ndodhë që kur zbulon një pikëpresje në mes të SP, interpretuesi SQL do të supozojë se komanda është futur plotësisht dhe do të përpiqet të ekzekutojë një pjesë të procedurës së ruajtur? Ky supozim ka kuptim. Në të vërtetë, nëse krijoni një skedar në të cilin do të shkruani shembullin e mësipërm, shtoni një komandë për t'u lidhur nga baza e të dhënave dhe përpiqeni të ekzekutoni këtë skript SQL duke përdorur interpretuesin isql, do të kthehet një gabim i lidhur me të papriturën, sipas interpretuesit, fundi i komandës për të krijuar një procedurë të ruajtur. Nëse krijoni procedura të ruajtura duke përdorur skedarë skripti SQL, pa përdorur mjete të specializuara zhvilluesish InterBase, atëherë përpara çdo komande për të krijuar CP (e njëjta gjë vlen edhe për shkaktarët), ndryshoni ndarësin e komandës së skriptit në një karakter tjetër përveç pikëpresjes dhe pas tekstit HP në rivendoseni atë. Komanda isql që ndryshon ndarësin e deklaratave SQL duket si kjo:

VENDOSJE AFAT

Për një rast tipik të krijimit të një procedure të ruajtur, duket kështu:

VENDOSI AFATIN ^;
KRIJO PROCEDURE disa_procedurë
... . .
FUND
^
VENDOSI AFATIN; ^

Thirrje me procedurë të ruajtur

Por përsëri në procedurën tonë të ruajtur. Tani që është krijuar, duhet ta telefononi disi, t'i kaloni parametrat dhe të merrni rezultatet e kthyera. Është shumë e lehtë për ta bërë këtë - ju vetëm duhet të shkruani një pyetje SQL të formës së mëposhtme:

ZGJIDH *
NGA Sp_add (181.35, 23.09)

Ky pyetës do të na kthejë një rresht që përmban vetëm një fushë Rezultati, e cila do të përmbajë shumën e numrave 181.35 dhe 23.09, pra 204.44.
Kështu, procedura jonë mund të përdoret në pyetjet e zakonshme SQL të ekzekutuara si në programet e klientit, ashtu edhe në CP-të ose aktivizuesit e tjerë. Ky përdorim i procedurës sonë u bë i mundur nga përdorimi i komandës SUSPEND në fund të procedurës së ruajtur.
Fakti është se në InterBase (dhe në të gjitha klonet e tij) ekzistojnë dy lloje procedurash të ruajtura: procedura të përzgjedhshme dhe procedura të ekzekutueshme. Dallimi në funksionimin e këtyre dy llojeve të PS është se procedurat e marrjes zakonisht kthejnë shumë grupe parametrash dalëse, të grupuara rresht pas rreshti, të cilët janë në formën e një grupi të dhënash dhe procedurat e ekzekutuara ose mund të mos kthejnë fare parametra. ose ktheni vetëm një grup parametrash dalës të listuar në Kthimet, ku një linjë e vetme parametrash. Procedurat e përzgjedhjes thirren në pyetjet SELECT, dhe procedurat e ekzekutueshme thirren duke përdorur komandën EXECUTE PROCEDURE.
Të dy llojet e procedurave të ruajtura kanë të njëjtën sintaksë të krijimit dhe nuk janë formalisht të ndryshme, kështu që çdo procedurë e ekzekutueshme mund të thirret në një pyetje SELECT dhe çdo procedurë përzgjedhjeje mund të thirret duke përdorur PROCEDURËN EXECUTE. Pyetja është se si do të sillen HP-të me lloje të ndryshme thirrjesh. Me fjalë të tjera, ndryshimi qëndron në hartimin e procedurës për një lloj të caktuar thirrjeje. Kjo do të thotë, një procedurë përzgjedhje krijohet në mënyrë specifike për t'u thirrur nga një pyetje SELECT, dhe një procedurë e ekzekutueshme është krijuar posaçërisht për t'u thirrur duke përdorur PROCEDURA EXECUTE. Le të hedhim një vështrim se cilat janë ndryshimet në dizajnin e këtyre dy llojeve të HP.
Për të kuptuar se si funksionon procedura e kampionimit, duhet të futeni pak më thellë në teori. Le të imagjinojmë një pyetje tipike SQL si SELECT ID, EMRI NGA Tabela_shembull. Si rezultat i ekzekutimit të tij, ne marrim në dalje një tabelë të përbërë nga dy kolona (ID dhe EMRI) dhe një numër të caktuar rreshtash (të barabartë me numrin e rreshtave në tabelën Table_example). Tabela e kthyer si rezultat i këtij pyetësori quhet gjithashtu një grup të dhënash SQL Le të mendojmë se si formohet grupi i të dhënave gjatë ekzekutimit të këtij pyetësori. Serveri, pasi ka marrë një pyetje, përcakton se cilës tabela i përket, më pas zbulon se cilës nëngrup të dhënat nga këto tabela duhet të përfshihen në rezultatin e pyetjes ... Më pas, serveri lexon çdo rekord që plotëson rezultatet e pyetjes, zgjedh fushat e kërkuara prej tij (në rastin tonë, këto janë ID dhe EMRI) dhe ia dërgon klientit. Pastaj procesi përsëritet përsëri - dhe kështu me radhë për çdo hyrje të zgjedhur.
I gjithë ky digresion është i nevojshëm në mënyrë që lexuesi i dashur të kuptojë se të gjitha grupet e të dhënave SQL janë formuar rresht pas rreshti, përfshirë në procedurat e ruajtura! Dhe ndryshimi kryesor midis procedurave të marrjes dhe procedurave të ekzekutueshme është se të parat janë krijuar për të kthyer shumë rreshta, ndërsa të dytat janë vetëm për një. Prandaj, ato përdoren në mënyra të ndryshme: një procedurë select quhet duke përdorur komandën SELECT, e cila "kërkon" që procedura të japë të gjitha rekordet që mund të kthejë. Procedura e ekzekutueshme quhet duke përdorur PROCEDURA EKZEKUTUESE, e cila "nxjerr" vetëm një rresht nga CP, dhe injoron pjesën tjetër (edhe nëse ka!).
Le të shohim një shembull të një procedure të tërheqjes për ta bërë më të qartë. Për falje, le të krijojmë një procedurë të ruajtur që funksionon saktësisht si pyetja SELECT ID, NAME FROM Table_Example, domethënë, ajo thjesht merr fushat ID dhe EMRI nga e gjithë tabela. Ja ky shembull:

KRIJO PROCEDURE Simple_Select_SP
KTHIMI (
GJENDJA E PLOTË procID,
procNAME VARCHAR (80))
AS
FILLOJ
PËR
SELECT ID, EMRI NGA tabela_shembull
INTO: procID,: procNAME
BËJ
FILLOJ
PEZULLOJ;
FUND
FUND

Le të ecim nëpër hapat e kësaj rutine të quajtur Simple_Select_SP. Siç mund ta shihni, ai nuk ka parametra hyrës dhe ka dy parametra dalës - ID dhe EMRI. Gjëja më interesante, natyrisht, qëndron në trupin e procedurës. Konstrukti FOR SELECT përdoret këtu:

PËR
SELECT ID, EMRI NGA tabela_shembull
INTO: procID,: procNAME
BËJ
FILLOJ

/ * bëni diçka me variablat procID dhe procName * /

FUND

Kjo pjesë e kodit do të thotë si vijon: për çdo rresht të zgjedhur nga Tabela_shembull, vendosni vlerat e zgjedhura në variablat procID dhe procName dhe më pas kryeni disa veprime me këto variabla.
Ju mund të bëni një fytyrë të befasuar dhe të pyesni: "Variabla? Çfarë ndryshore të tjera? 9" Është një lloj befasie në këtë kapitull që ne mund të përdorim variabla në procedurat e ruajtura. Në gjuhën XPS, ju mund të deklaroni variablat tuaja lokale brenda një procedure, ose të përdorni parametrat e hyrjes dhe të daljes si variabla.
Për të deklaruar një ndryshore lokale në një procedurë të ruajtur, duhet ta vendosni përshkrimin e saj pas fjalës kyçe AS dhe para fjalës së parë BEGIN. Përshkrimi i një ndryshoreje lokale duket si ky:

DEKLARONI NDRYSHORIN ;

Për shembull, për të deklaruar një variabël lokal me numër të plotë Mylnt, futni përshkrimin e mëposhtëm midis AS dhe BEGIN

DEKLAROJ NDRYSHORIN Mylnt INTEGER;

Variablat në shembullin tonë fillojnë me dy pika. Kjo bëhet sepse ato referohen brenda deklaratës SQL FOR SELECT, kështu që për të dalluar fushat në tabela që përdoren në SELECT dhe variablat, duhet t'i paraprini dy pikave të fundit. Në fund të fundit, variablat mund të kenë saktësisht të njëjtin emër si fushat në tabela!
Por dy pika përpara emrit të ndryshores duhet të përdoret vetëm brenda pyetjeve SQL. Jashtë teksteve, qasja në një variabël bëhet pa dy pika, për shembull:

procName = "Disa emër";

Por përsëri në trupin e procedurës sonë. Klauzola FOR SELECT kthen të dhënat jo në formën e një tabele - një grup të dhënash, por një rresht në një kohë. Çdo fushë e kthyer duhet të vendoset në variablin e saj: ID => procID, EMRI => procName. Në pjesën DO, këto variabla i dërgohen klientit që thirri) procedure> p> duke përdorur komandën SUSPEND
Kështu, komanda FOR SELECT ... DO qarkullon nëpër të dhënat e zgjedhura në pjesën SELECT të komandës. Në trupin e ciklit të formuar nga pjesa DO, rekordi tjetër i gjeneruar i transferohet klientit duke përdorur komandën SUSPEND.
Pra, procedura e marrjes është projektuar për të kthyer një ose më shumë rreshta, për të cilat organizohet një lak brenda trupit të SP që plotëson parametrat e variablave që rezultojnë. Dhe në fund të trupit të këtij cikli ka gjithmonë një komandë SUSPEND, e cila do t'i kthejë klientit linjën tjetër të të dhënave.

Loops dhe operatorët e degëzimit

Përveç komandës FOR SELECT ... DO, e cila organizon një lak mbi të dhënat e një përzgjedhjeje, ekziston një lloj tjetër cikli - WHILE ... DO, i cili ju lejon të organizoni një cikli bazuar në kontrollimin e çdo kushti. Këtu është një shembull i një CP që përdor një cikli WHILE .. DO. Kjo rutinë kthen katrorët e numrave të plotë midis 0 dhe 99:

CREATE PROCEDJRE QUAD
KTHIMET (KUADRAT INTEGER)
AS
DEKLAROJ NDRYSHORIN I INTEGER;
FILLOJ
I = 1;
Nderkohe une<100) DO
FILLOJ
KUADRAT = I * I;
I = I + 1;
PEZULLOJ;
FUND
FUND

Si rezultat i ekzekutimit të pyetjes SELECT FROM QUAD, do të marrim një tabelë që përmban një kolonë QUADRAT, në të cilën do të ketë katrorë të numrave të plotë nga 1 në 99.
Përveç përsëritjes mbi rezultatet e një përzgjedhjeje SQL dhe një cikli klasik, gjuha e procedurës së ruajtur përdor operatorin IF ... THEN..ELSE, i cili ju lejon të organizoni degëzimin në varësi të ekzekutimit të disa fjalëve. Sintaksa e saj është ngjashëm me shumicën e operatorëve të degëzimit në gjuhët e programimit të nivelit të lartë, si Pascal dhe C.
Le të hedhim një vështrim në një shembull më kompleks të një procedure të ruajtur që bën sa më poshtë.

  1. Llogarit çmimin mesatar në tabelën Table_example (shih kapitullin "Tabelat Çelësat dhe Gjeneratorët Primarë")
  2. Më pas, për çdo rekord në tabelë, bën kontrollin e mëposhtëm, nëse çmimi ekzistues (PRICE) është më i madh se çmimi mesatar, atëherë vendos çmimin të barabartë me vlerën e çmimit mesatar, plus një përqindje fikse të specifikuar.
  3. Nëse çmimi ekzistues është më i vogël ose i barabartë me çmimin mesatar, atëherë vendos çmimin të barabartë me çmimin e mëparshëm, plus gjysmën e diferencës midis çmimeve të mëparshme dhe mesatare.
  4. Kthen të gjitha rreshtat e ndryshuara në tabelë.

Së pari, le të përcaktojmë emrin e SP-së, si dhe parametrat hyrës dhe dalës.E gjithë kjo shkruhet në kokën e procedurës së ruajtur.

KRIJO PROCEDURE Rritja e Çmimeve (
Përqindja 2lnrritje SAKTËSI E DYFISH)
KTHIM (ID INTEGER, EMRI VARCHAR (SO), new_price DOUBLE
PRECISION) AS

Procedura do të quhet IncreasePrices, ajo ka një parametër hyrës Peiceni21nciease të tipit DOUBLE PRECISION, dhe 3 parametra dalës - ID, EMRI dhe new_pnce. Vini re se dy parametrat e parë të daljes kanë emra të njëjtë me fushat në shembullin_Tabela me të cilat do të punojmë.Kjo lejohet nga rregullat e gjuhës së procedurës së ruajtur.
Tani duhet të deklarojmë një variabël lokale që do të përdoret për të ruajtur vlerën mesatare. Kjo deklaratë do të duket si kjo:

DEKLAROJ NDRYSHIMIN mesatar_çmimin PRECISION DYFISH;

Tani le të kalojmë në trupin e procedurës së ruajtur: Hapni trupin e HP fjalë kyçe FILLIM.
Së pari, ne duhet të kryejmë hapin e parë të algoritmit tonë - të llogarisim çmimin mesatar. Për ta bërë këtë, ne do të përdorim një pyetje të formës së mëposhtme:

SELECT AVG (Çmimi_l)
NGA Tabela_Shembull
INTO: çmimi_mesatar, -

Ky pyetës përdor funksionin agregat AVG, i cili kthen mesataren e fushës PRICE_1 midis rreshtave të përzgjedhur të pyetjeve — në këtë rast, mesataren prej PRICE_1 për të gjithë shembullin e tabelës. Vlera e kthyer nga pyetja vendoset në variablin avg_price. Vini re se variabla avg_pnce paraprihet nga një dy pika - për ta dalluar atë nga fushat e përdorura në pyetje.
E veçanta e kësaj kërkese është se ajo gjithmonë kthen saktësisht një dhe të vetëm regjistrim. Pyetje të tilla quhen pyetje singleton dhe vetëm zgjedhje të tilla mund të përdoren në procedurat e ruajtura. Nëse pyetja kthen më shumë se një rresht, atëherë ai duhet të formatohet në formën e një strukture FOR SELECT ... DO, e cila organizon një lak për të përpunuar çdo rresht të kthyer
Pra, morëm vlerën mesatare të çmimit. Tani ju duhet të kaloni në të gjithë tabelën, të krahasoni vlerën e çmimit në çdo rekord me çmimin mesatar dhe të merrni masat e duhura.
Që në fillim, ne organizojmë përsëritjen mbi çdo rekord nga tabela Table_example.

PËR
SELECT ID, EMRI, PRICE_1
NGA Tabela_Shembull
INTO: ID,: EMRI,: çmimi_i ri
BËJ
FILLOJ
/ * _ ossify çdo rekord këtu * /
FUND

Kur të ekzekutohet ky ndërtim, të dhënat do të merren rresht pas rreshti nga Tabela_example dhe vlerat e fushës në secilën rresht do t'u caktohen variablave ID, NAME dhe new_pnce. Sigurisht, do të mbani mend se këto variabla janë deklaruar si parametra jashtë, por nuk duhet të shqetësoheni se të dhënat e zgjedhura do të kthehen si rezultate: fakti që diçka i është caktuar parametrave out nuk do të thotë që klienti që thërret HP do t'i marrë menjëherë këto vlera. ! Parametrat kalohen vetëm kur ekzekutohet komanda SUSPEND, dhe para kësaj ne mund t'i përdorim parametrat e daljes si variabla të zakonshëm - në shembullin tonë, ne e bëjmë pikërisht këtë me parametrin new_price.
Pra, brenda trupit të lakut BEGIN .. .END, ne mund të përpunojmë vlerat e çdo rreshti. Siç e mbani mend, ne duhet të zbulojmë se si çmimi aktual krahasohet me mesataren dhe të ndërmarrim veprimet e duhura. Ne do ta zbatojmë këtë procedurë krahasimi duke përdorur deklaratën IF:

IF (çmimi_i_çmimi> mesatar_çmimi) THËNË / * nëse çmimi ekzistues është më i lartë se çmimi mesatar * /
FILLOJ
/ * më pas vendosni një çmim të ri të barabartë me çmimin mesatar plus një përqindje fikse * /
çmimi_i_ri = (çmimi_mesatar + çmimi_mesatar * (Përqindja2Rritje / 100));
Përditëso tabelën_shembull
SET PRICE_1 =: çmimi_ri
KU ID =: ID;
FUND
TJETER
FILLOJ
/ * Nëse çmimi ekzistues është më i vogël ose i barabartë me çmimin mesatar, atëherë vendosni çmimin të barabartë me çmimin e mëparshëm, plus gjysmën e diferencës midis çmimeve të mëparshme dhe mesatare * /
çmimi_i_ri = (çmimi_i_ri + ((çmimi_mes_pnce_i_ri) / 2));
Përditëso tabelën_shembull
SET PRICE_1 =: çmimi_ri
KU ID = .ID;
FUND

Siç mund ta shihni, rezultati është një ndërtim mjaft i madh IF, i cili do të ishte i vështirë për t'u kuptuar nëse nuk do të ishin për komentet e mbyllura në / ** / simbolet.
Për të ndryshuar çmimin sipas diferencës së llogaritur, ne do të përdorim deklaratën UPDATE, e cila ju lejon të modifikoni të dhënat ekzistuese - një ose më shumë. Për të treguar pa mëdyshje se në cilin rekord duhet të ndryshohet çmimi, ne përdorim fushën e çelësit primar në klauzolën WHERE, duke e krahasuar atë me vlerën e ndryshores që ruan vlerën ID për rekordin aktual: ID =: ID. Vini re se variabla ID paraprihet nga një dy pika.
Pas ekzekutimit të konstruksionit IF ... THEN ... ELSE, variablat ID, EMRI dhe new_price përmbajnë të dhëna që duhet t'ia kthejmë klientit \ te thirrësi i procedurës. Për ta bërë këtë, pas IF, është e nevojshme të futet komanda SUSPEND, e cila do të dërgojë të dhënat në vendin nga i cili është thirrur PS. Gjatë transferimit, procedura do të pezullohet dhe kur kërkohet një regjistrim i ri nga PS, ajo do të vazhdojë përsëri, dhe kjo do të vazhdojë derisa FOR SELECT ... DO nuk do të përsërisë mbi të gjitha të dhënat e pyetjes së saj.
Duhet të theksohet se përveç komandës SUSPEND, e cila pezullon vetëm procedurën e ruajtur, ekziston një komandë EXIT, e cila përfundon procedurën e ruajtur pasi të jetë kaluar vargu. Sidoqoftë, komanda EXIT përdoret rrallë, pasi nevojitet kryesisht për të ndërprerë ciklin kur arrihet një kusht.
Në këtë rast, në rastin kur procedura është thirrur nga deklarata SELECT dhe është përfunduar nga EXIT, rreshti i fundit i marrë nuk do të kthehet. Kjo do të thotë, nëse ju duhet të ndërprisni procedurën dhe akoma> të merrni këtë varg, duhet të përdorni sekuencën

PEZULLOJ;
DALJE;

Qëllimi kryesor i EXIT është të marrë grupe të dhënash të vetme, parametrat e kthimit, duke thirrur përmes PROCEDURES EKZEKUTIMI. Në këtë rast, vendosen vlerat e parametrave të daljes, por grupi i të dhënave SQL nuk formohet prej tyre dhe procedura përfundon.
Le të shkruajmë të gjithë tekstin e procedurës sonë të ruajtur në mënyrë që të mund të kapim logjikën e saj me një shikim:

KRIJO PROCEDURE Rritja e Çmimeve (
Përqindja 2 Rrite SAKTËSInë e dyfishtë)
KTHIM (ID INTEGER, EMRI VARCHAR (80),
çmimi_i ri SAKTËSIA E DYFISHTE) AS
DEKLAROJ NDRYSHIMIN mesatar_çmimin PRECISION DYFISH;
FILLOJ
SELECT AVG (Çmimi_l)
NGA Tabela_Shembull
INTO: çmimi_mesatar;
PËR
SELECT ID, EMRI, PRICE_1
NGA Tabela_Shembull
INTO: ID,: EMRI,: çmimi_i ri
BËJ
FILLOJ
/ * përpunoni çdo rekord këtu * /
IF (new_pnce> avg_price) THËNË / * nëse çmimi ekzistues është më i lartë se çmimi mesatar * /
FILLOJ
/ * vendosni një çmim të ri të barabartë me çmimin mesatar plus një përqindje fikse * /
çmimi_i_ri = (çmimi_mesatar + çmimi_mesatar * (Përqindja2lnrritje / 100));
Përditëso tabelën_shembull
SET PRICE_1 =: çmimi_ri
KU ID =: ID;
FUND
TJETER
FILLOJ
/ * Nëse çmimi ekzistues është më i vogël ose i barabartë me çmimin mesatar, atëherë vendos çmimin e barabartë me çmimin e mëparshëm, plus gjysmën e diferencës midis çmimeve të mëparshme dhe mesatare * /
çmimi_i_ri = (çmimi_i_ri + ((çmimi_mesatar - çmimi_i_ri) / 2));
Përditëso tabelën_shembull
SET PRICE_1 =: çmimi_ri
KU ID =: ID;
FUND
PEZULLOJ;
FUND
FUND

Kjo procedurë kampione e ruajtur ilustron përdorimin e procedurës bazë të ruajtur dhe konstrukteve të gjuhës nxitëse. Më pas, do të shohim se si të përdorim procedurat e ruajtura për të zgjidhur disa probleme të zakonshme.

Procedurat e ruajtura rekursive

Procedurat e ruajtura InterBase mund të jenë rekursive. Kjo do të thotë që ju mund të telefononi veten nga një procedurë e ruajtur. Lejohen deri në 1000 nivele të foleve të procedurave të ruajtura, por mbani mend se burimet e lira në server mund të mbarojnë përpara se të arrihet maksimumi i foleve të HP-së.
Një nga përdorimet e zakonshme për procedurat e ruajtura është manipulimi i strukturave të pemëve të ruajtura në një bazë të dhënash. Pemët përdoren shpesh në inventar, deponim, HR dhe aplikacione të tjera të zakonshme.
Le të shohim një shembull të një procedure të ruajtur që zgjedh të gjitha produktet e një lloji specifik, duke filluar nga një nivel specifik foleje.
Supozoni se kemi deklaratën e mëposhtme të problemit: ne kemi një drejtori produkti me një strukturë hierarkike të llojit të mëposhtëm:

Produktet
- Pajisjet
- Frigoriferë
- Tre dhoma
- Dy dhomash
- Dhoma e vetme
- Lavatriçe
- Vertikale
- Frontale
- Klasike
- E ngushtë
- Teknologji kompjuterike
....

Kjo strukturë e drejtorisë së kategorive të produkteve mund të ketë degë me thellësi të ndryshme. dhe gjithashtu ndërtohet me kalimin e kohës. Detyra jonë është të sigurojmë që të gjithë elementët e fletës të zgjidhen nga drejtoria me "zgjerimin e emrit të plotë", duke filluar nga çdo nyje. Për shembull, nëse zgjedhim nyjen "Makinat larëse", atëherë duhet të marrim kategoritë e mëposhtme:

Lavatrice - Vertikale
Makina larëse - Front Classic
Lavatrice - Para Narrow

Le të përcaktojmë strukturën e tabelave për ruajtjen e informacionit në katalogun e mallrave. Ne përdorim një skemë të thjeshtuar për të organizuar pemën në një tabelë:

KRIJO TABELË GoodsTree
(ID_GOOD INTEGER JO NULL,
ID_PARENT_GOOD INTEGER,
GOOD_NAME VARCHAR (80),
kufizim pkGooci çelësi primar (ID_GOOD));

Ne krijojmë një tabelë GoodsTree, në të cilën ka vetëm 3 fusha: ID_GOOD - identifikues i kategorisë inteligjente, ID_PARENT_GOOD - identifikues i qytetit mëmë për këtë kategori dhe GOOD_NAME - emri i kategorisë. Për të siguruar integritetin e të dhënave në këtë tabelë, ne vendosim një kufizim të çelësit të huaj në këtë tabelë:

ALTER TABLE GoodsTree
SHTO KUFIZIM FK_goodstree
ÇELËSI I HUAJ (ID_PARENT_GOOD)
REFERENCAT GOODSTPEE (ID__GOOD)

Tabela i referohet vetes dhe çelësi i huaj i dhënë mban gjurmët e tij. në mënyrë që të mos ketë referenca për prindërit joekzistues në tabelë, dhe gjithashtu parandalon përpjekjet për të fshirë kategoritë e produkteve që kanë pasardhës.
Le të vendosim të dhënat e mëposhtme në tabelën tonë:

ID_MIRA

1
2
3
4
5
6
7
8
9
10
11
12

ID_PARENT_GOOD

0
1
1
2
2
4
4
4
5
5
10
10

EMËR I MIRË

MALLRAT
Pajisjet
Kompjuterë dhe aksesorë
Frigoriferë
Lavatriçe
me tre dhoma
Dydhomësh
Dhoma e vetme
Vertikale
Frontale
I ngushtë
Klasike

Tani që kemi pak hapësirë ​​ruajtëse, mund të fillojmë të krijojmë një procedurë të ruajtur që shfaq të gjitha kategoritë e produkteve "përfundimtare" në një pamje "të zgjeruar" - për shembull, për kategorinë "Tre ndarje", emri i plotë i kategorisë do të duken si "Aparate shtëpiake Frigoriferë me tre dhoma".
Procedurat e ruajtura që përpunojnë struktura të ngjashme me pemën kanë terminologjinë e tyre. Çdo element i pemës quhet nyje; dhe marrëdhënia ndërmjet nyjeve që i referohen njëra-tjetrës quhet marrëdhënie prind-fëmijë. Nyjet që janë në fund të pemës dhe nuk kanë fëmijë quhen "gjethe".
Procedura jonë e ruajtur do të ketë një identifikues kategorie si parametër hyrës, nga i cili do të duhet të fillojmë të shpalosemi. Procedura e ruajtur do të duket si kjo:

KRIJO PROCEDURE GETFULLNAME (ID_GOOD2SHOW INTEGER)
RETURNS (FULL_GOODS_NAME VARCHAR (1000),
ID_CHILD_GOD INTEGER)
AS
DEKLAROJ NDRYSHIMIN CURR_CHILD_NAME VARCHAR (80);
FILLOJ
/ * 0 organizoni ciklin e jashtëm FOR SELECT në pasardhësit e menjëhershëm të produktit me ID_GOOD = ID_GOOD2SHOW * /
PËR ZGJEDHJE gtl.id_good, gtl.good_name
NGA GoodsTree gtl
KU gtl.id_parent_good =: ID_good2show
INTO: ID_CHILD_GOOD,: full_goods_name
BËJ
FILLOJ
/ "Kontrollo me funksionin EXISTS, i cili kthen TRUE nëse pyetja në kllapa kthen të paktën një rresht. Nëse nyja e gjetur me ID_PARENT_GOOD = ID_CHILD_GOOD nuk ka pasardhës, atëherë është një "fletë" e pemës dhe futet në rezultate * /
NËSE (NUK EKZISTON (
ZGJIDH * NGA GoodsTree
KU GoodsTree.id_parent_good =: id_child_good))
PASTAJ
FILLOJ
/ * Kaloni "gjethin" e pemës tek rezultatet * /
PEZULLOJ;
FUND
TJETER
/ * Për nyjet që kanë fëmijë * /
FILLOJ
/ * ruani emrin e nyjes mëmë në një variabël të përkohshëm * /
CURR_CHILD_NAME = emri i_plotë i mallrave;
/ * ekzekuto këtë rutinë në mënyrë rekursive * /
PËR
SELECT ID_CHILD_GOOD, emri_plotë i mallrave
NGA GETFULLNAME (: ID_CHILD_GOOD)
INTO: ID_CHILD_GOOD,: full_goods_name
FILLO
/ * shtoni emrin e nyjës prind në atë të gjetur., emrin e fëmijës duke përdorur operacionin e lidhjes së vargut || * /
emri_i_plotë i_mallrave = CURR_CHILD_NAME | "" | f ull_emri_mallrave, -
PEZULLOJ; / * ktheni emrin e plotë të produktit * /
FUND
FUND
FUND
FUND

Nëse e ekzekutojmë këtë procedurë me parametrin hyrës ID_GOOD2SHOW = 1, marrim sa vijon:

Siç mund ta shihni, duke përdorur një procedurë të ruajtur rekursive, ne ecëm nëpër të gjithë pemën e kategorisë dhe shfaqëm emrin e plotë të kategorive "gjethe" që janë në majat e degëve.

konkluzioni

Kjo përfundon rishikimin e veçorive kryesore të gjuhës së procedurës së ruajtur. Natyrisht, është e pamundur të zotërohet plotësisht zhvillimi i procedurave të ruajtura në një kapitull, por këtu jemi përpjekur të paraqesim dhe shpjegojmë konceptet bazë që lidhen me procedurat e ruajtura. Konstruktet e përshkruara të CP dhe teknikat e projektimit mund të aplikohen në shumicën e aplikacioneve të bazës së të dhënave.
Disa nga çështjet e rëndësishme që lidhen me zhvillimin e procedurave të ruajtura do të shpalosen në kapitullin tjetër - "Karakteristika të avancuara të gjuhës së procedurës së ruajtur InterBase", e cila i kushtohet trajtimit të përjashtimeve, zgjidhjes së gabimeve në procedurat e ruajtura dhe punës me vargje.

Kur punojnë me SQL Server, përdoruesit mund të krijojnë procedurat e tyre që zbatojnë veprime të caktuara. Procedurat e ruajtura janë objekte të plota të bazës së të dhënave, dhe për këtë arsye secila prej tyre ruhet në një bazë të dhënash specifike. Një thirrje e drejtpërdrejtë në një procedurë të ruajtur është e mundur vetëm nëse bëhet në kontekstin e bazës së të dhënave ku ndodhet procedura.

Llojet e procedurave të ruajtura

Ekzistojnë disa lloje të procedurave të ruajtura në SQL Server.

    Procedurat e ruajtura në sistem janë krijuar për të kryer veprime të ndryshme administrative. Pothuajse të gjitha veprimet e administrimit të serverit kryhen me ndihmën e tyre. Mund të themi se procedurat e ruajtura në sistem janë një ndërfaqe që ofron punë me tabelat e sistemit, e cila në fund të fundit zbret në ndryshimin, shtimin, fshirjen dhe marrjen e të dhënave nga tabelat e sistemit të bazave të të dhënave të përdoruesve dhe të sistemit. Procedurat e ruajtura në sistem janë të prefiksuara me sp_, ruhen në bazën e të dhënave të sistemit dhe mund të thirren në kontekstin e çdo baze të dhënash tjetër.

    Procedurat e ruajtura me porosi zbatojnë veprime të caktuara. Procedurat e ruajtura janë një objekt i plotë i bazës së të dhënave. Si rezultat, çdo procedurë e ruajtur ndodhet në një bazë të dhënash specifike, ku edhe ekzekutohet.

    Procedurat e përkohshme të ruajtura ekzistojnë vetëm për një kohë të shkurtër, pas së cilës ato shkatërrohen automatikisht nga serveri. Ato ndahen në lokale dhe globale. Procedurat lokale të ruajtura të përkohshme mund të thirren vetëm nga lidhja në të cilën janë krijuar. Kur krijoni një procedurë të tillë, duhet t'i jepni një emër që fillon me një # karakter të vetëm. Ashtu si të gjithë objektet e përkohshme, procedurat e ruajtura të këtij lloji fshihen automatikisht kur përdoruesi shkëput, rinis ose ndalon serverin. Procedurat globale të ruajtura të përkohshme janë të disponueshme për çdo lidhje serveri që ka të njëjtën procedurë. Për ta përcaktuar atë, thjesht duhet t'i jepni një emër duke filluar me simbolet ##. Këto procedura fshihen kur serveri riniset ose ndalet, ose kur lidhja në kontekstin e së cilës janë krijuar mbyllet.

Shkaqet

Shkaqet janë një nga varietetet e procedurave të ruajtura. Ato ekzekutohen kur një deklaratë e gjuhës së manipulimit të të dhënave (DML) ekzekutohet kundër një tabele. Shkaktarët përdoren për të kontrolluar integritetin e të dhënave, si dhe për rikthimin e transaksioneve.

KthesëËshtë një procedurë SQL e përpiluar, ekzekutimi i së cilës kushtëzohet nga ndodhja e disa ngjarjeve brenda një baze të dhënash relacionale. Në pjesën më të madhe, përdorimi i nxitësve është shumë i përshtatshëm për përdoruesit e bazës së të dhënave. Megjithatë, përdorimi i tyre shpesh shoqërohet me kosto shtesë hyrëse/dalëse. Kur të njëjtat rezultate (me shumë më pak shpenzime të larta) mund të arrihen duke përdorur procedura ose aplikacione të ruajtura, aktivizuesit nuk janë praktik.

ShkaqetËshtë një mjet special i serverit SQL që përdoret për të ruajtur integritetin e të dhënave në një bazë të dhënash. Kufizimet e integritetit, rregullat dhe parazgjedhjet mund të mos ofrojnë gjithmonë nivelin e dëshiruar të funksionalitetit. Shpesh kërkohet të zbatohen algoritme të sofistikuara të vërtetimit të të dhënave për të siguruar vlefshmërinë dhe realitetin e të dhënave. Përveç kësaj, ndonjëherë ju duhet të gjurmoni ndryshimet në vlerat e tabelës në mënyrë që të modifikoni të dhënat përkatëse sipas nevojës. Shkaktarët mund të mendohen si një lloj filtrash që hyjnë në fuqi pasi të gjitha operacionet janë kryer në përputhje me rregullat, vlerat standarde, etj.

Kthesëështë një lloj i veçantë i procedurave të ruajtura që serveri i ekzekuton automatikisht kur përpiqet të modifikojë të dhënat në tabela me të cilat lidhen nxitësit. Secili Kthesë lidhet me një tabelë specifike. Të gjitha modifikimet e të dhënave që ai bën trajtohen si një transaksion. Nëse zbulohet një gabim ose shkelje e integritetit të të dhënave, transaksioni rikthehet. Pra, bërja e ndryshimeve është e ndaluar. Çdo ndryshim i bërë tashmë nga këmbëza hidhet gjithashtu.

Krijon shkas vetëm pronari i bazës së të dhënave. Ky kufizim lejon shmangien e ndryshimeve aksidentale në strukturën e tabelave, mënyrat e lidhjes së objekteve të tjera me to, etj.

Kthesëështë një mjet shumë i dobishëm dhe në të njëjtën kohë i rrezikshëm. Pra, nëse logjika e punës së saj është e gabuar, ju lehtë mund të shkatërroni të gjithë bazën e të dhënave, kështu që shkaktarët duhet të korrigjohen me shumë kujdes.

Ndryshe nga një nënprogram i rregullt, shkas ekzekutohet në mënyrë implicite sa herë që ndodh një ngjarje nxitëse dhe nuk ka argumente. Gjuajtja e tij nganjëherë referohet si shkrepje e këmbëzës. Shkaktarët arrijnë qëllimet e mëposhtme:

    kontrollimi i korrektësisë së të dhënave të futura dhe zbatimi i kufizimeve komplekse të integritetit të të dhënave që janë të vështira, nëse jo të pamundura, për t'u ruajtur duke përdorur kufizimet e integritetit të vendosura në tabelë;

    lëshimin e paralajmërimeve që kujtojnë nevojën për të kryer disa veprime gjatë përditësimit të tabelës, të zbatuara në një mënyrë të caktuar;

    grumbullimi i informacionit të auditimit duke fiksuar informacionin për ndryshimet e bëra dhe personat që i kanë kryer ato;

    mbështetje për replikimin.

Formati bazë i komandës CREATE TRIGGER tregohet më poshtë:

<Определение_триггера>::=

KRIJO TRIGGER emri i këmbëzës

PARA | PAS<триггерное_событие>

AKTIV<имя_таблицы>

<список_старых_или_новых_псевдонимов>]

<тело_триггера>

Ngjarjet e aktivizimit përbëhen nga futja, fshirja dhe përditësimi i rreshtave në një tabelë. Në rastin e fundit, mund të specifikoni emrat e kolonave specifike të tabelës për ngjarjen e nxitjes. Koha e nisjes së aktivizimit përcaktohet duke përdorur fjalët kyçe PARA ( Kthesë shkrep përpara se ngjarjet e lidhura me të të ekzekutohen) ose PAS (pasi ato të ekzekutohen).

Veprimet e kryera nga aktivizuesi specifikohen për çdo rresht (PER CDO RRESHT) të mbuluar nga kjo ngjarje, ose vetëm një herë për çdo ngjarje (PER CDO DEKLARIME).

Shkaktarët e shkruar gabimisht mund të çojnë në probleme serioze siç janë bllokimet. Aktivizuesit mund të bllokojnë shumë burime për periudha të gjata kohore, kështu që duhet t'i kushtoni vëmendje të veçantë minimizimit të konflikteve të aksesit.

Kthesë mund të krijohet vetëm në bazën e të dhënave aktuale, por lejohet të hyjë në baza të tjera të dhënash brenda këmbëzës, duke përfshirë ato të vendosura në një server të largët.

Procedurat e ruajtura SQL janë module softuerike të ekzekutueshme që mund të ruhen si objekte të ndryshme. Me fjalë të tjera, është një objekt që përmban deklarata SQL. Këto procedura të ruajtura mund të ekzekutohen në klientin e aplikacionit për të marrë performancë të mirë. Për më tepër, objekte të tilla shpesh thirren nga skriptet e tjera ose edhe nga ndonjë seksion tjetër.

Prezantimi

Shumë njerëz mendojnë se ato janë të ngjashme me procedura të ndryshme (përkatësisht, me përjashtim të MS SQL). Ndoshta kjo është e vërtetë. Ata kanë parametra të ngjashëm dhe mund të prodhojnë vlera të ngjashme. Për më tepër, në disa raste ato prekin. Për shembull, ato mund të kombinohen me bazat e të dhënave DDL dhe DML dhe funksionet e përdoruesit (me emrin e koduar UDF).

Në realitet, procedurat e ruajtura SQL kanë një gamë të gjerë avantazhesh që i veçojnë ato nga proceset e ngjashme. Siguria, ndryshueshmëria e programimit, produktiviteti - e gjithë kjo tërheq përdoruesit që punojnë me bazat e të dhënave gjithnjë e më shumë. Kulmi i popullaritetit të procedurave erdhi në 2005-2010, kur u lëshua një program nga Microsoft i quajtur "SQL Server Management Studio". Me ndihmën e tij, puna me bazat e të dhënave është bërë shumë më e lehtë, më praktike dhe më e përshtatshme. Nga viti në vit kjo po fitonte popullaritet në mesin e programuesve. Sot, është një program absolutisht i njohur, i cili për përdoruesit që "komunikojnë" me bazat e të dhënave, është në të njëjtin nivel me Excel.

Kur thirret një procedurë, ajo përpunohet menjëherë nga vetë serveri pa procese të panevojshme dhe ndërhyrje të përdoruesit. Pas kësaj, ju mund të kryeni çdo fshirje, ekzekutim, ndryshim. E gjithë kjo është përgjegjësi e operatorit DDL, i cili i vetëm kryen operacionet më komplekse për përpunimin e objekteve. Për më tepër, e gjithë kjo ndodh shumë shpejt, dhe serveri në të vërtetë nuk është i ngarkuar. Një shpejtësi dhe performancë e tillë lejojnë transferimin shumë të shpejtë të sasive të mëdha të informacionit nga përdoruesi në server dhe anasjelltas.

Për të zbatuar këtë teknologji për të punuar me informacion, ekzistojnë disa gjuhë programimi. Këto përfshijnë, për shembull, PL / SQL nga Oracle, PSQL në sistemet InterBase dhe Firebird, si dhe versionin klasik të Microsoft Transact-SQL. Të gjitha ato janë të dizajnuara për krijimin dhe ekzekutimin e procedurave të ruajtura, gjë që lejon mbajtësit e mëdhenj të bazës së të dhënave të përdorin algoritmet e tyre. Kjo është gjithashtu e nevojshme në mënyrë që ata që menaxhojnë informacione të tilla të mund të mbrojnë të gjitha objektet nga aksesi i paautorizuar nga palët e treta dhe, në përputhje me rrethanat, krijimi, modifikimi ose fshirja e të dhënave të caktuara.

Produktiviteti

Këto objekte të bazës së të dhënave mund të programohen në mënyra të ndryshme. Kjo i lejon përdoruesit të zgjedhin llojin e metodës së përdorur që është më e përshtatshme, gjë që kursen kohë dhe përpjekje. Për më tepër, procedura trajtohet vetë, gjë që shmang shkëmbimin e madh që kërkon kohë midis serverit dhe përdoruesit. Gjithashtu, moduli mund të riprogramohet dhe ndryshohet në drejtimin e dëshiruar absolutisht në çdo kohë. Vlen të përmendet veçanërisht shpejtësia me të cilën niset procedura e ruajtur SQL: ky proces është më i shpejtë se të tjerët, i ngjashëm me të, gjë që e bën atë të përshtatshëm dhe të gjithanshëm.

Siguria

Ky lloj i përpunimit të informacionit ndryshon nga proceset e ngjashme në atë që garanton siguri të shtuar. Kjo sigurohet për faktin se aksesi i përdoruesve të tjerë në procedura mund të përjashtohet plotësisht dhe plotësisht. Kjo do t'i lejojë administratorit të kryejë operacione me ta vetë, pa frikë nga përgjimi i informacionit ose aksesi i paautorizuar në bazën e të dhënave.

Transferimi i të dhënave

Marrëdhënia midis procedurës së ruajtur SQL dhe aplikacionit të klientit është nëpërmjet përdorimit të parametrave dhe vlerave të kthyera. Ky i fundit nuk ka nevojë të transferojë të dhëna në procedurën e ruajtur, megjithatë, ky informacion (kryesisht me kërkesë të përdoruesit) përpunohet për SQL. Pasi procedura e ruajtur të ketë përfunduar punën e saj, ajo dërgon paketat e të dhënave mbrapsht (por, përsëri, opsionalisht) në aplikacionin thirrës duke përdorur metoda të ndryshme që mund të përdoren për të thirrur procedurën e ruajtur SQL dhe për të kthyer, për shembull:

Kalimi i të dhënave duke përdorur një parametër të llojit Output;

Transferimi i të dhënave duke përdorur një deklaratë kthimi;

Kalimi i të dhënave duke përdorur një operator të zgjedhur.

Tani le të kuptojmë se si duket ky proces nga brenda.

1. Krijimi i një procedure të ruajtur EXEC në SQL

Mund të krijoni një procedurë në MS SQL (Managment Studio). Pasi të krijohet procedura, ajo do të renditet në një nyje të programueshme të bazës së të dhënave, në të cilën procedura e krijimit kryhet nga operatori. Për ekzekutim, procedurat e ruajtura SQL përdorin një proces EXEC që përmban emrin e vetë objektit.

Kur krijohet një procedurë, emri i saj shfaqet fillimisht, pas së cilës prodhohen një ose më shumë parametra që i janë caktuar. Parametrat mund të jenë opsionale. Pasi të shkruhet parametri (t), domethënë trupi i procedurës, duhet të kryeni disa operacione të nevojshme.

Fakti është se trupi mund të ketë variabla lokale të vendosura në të, dhe këto variabla janë gjithashtu lokale për procedurat. Me fjalë të tjera, ato mund të shihen vetëm brenda trupit të një procedure të Microsoft SQL Server. Procedurat e ruajtura konsiderohen më pas lokale.

Kështu, për të krijuar një procedurë, na duhet emri i procedurës dhe të paktën një parametër si trupi i procedurës. Vini re se një opsion i shkëlqyeshëm në këtë rast është krijimi dhe ekzekutimi i një procedure të quajtur skema në klasifikues.

Trupi i procedurës mund të jetë i çdo lloji, për shembull, si krijimi i një tabele, futja e një ose më shumë rreshtave të një tabele, vendosja e llojit dhe natyrës së bazës së të dhënave, etj. Megjithatë, organi i procedurës kufizon kryerjen e veprimeve të caktuara në të. Disa nga kufizimet e rëndësishme janë renditur më poshtë:

Trupi nuk duhet të krijojë asnjë procedurë tjetër të ruajtur;

Trupi nuk duhet të krijojë një përshtypje të rreme për objektin;

Trupi nuk duhet të krijojë asnjë shkaktar.

2. Vendosja e një variabli në trupin e procedurës

Ju mund të bëni variabla lokale në trupin e procedurës, dhe më pas ato do të vendosen ekskluzivisht brenda trupit të procedurës. Është praktikë e mirë të krijohen variabla në fillim të trupit të procedurës së ruajtur. Por ju gjithashtu mund të vendosni variabla kudo në trupin e këtij objekti.

Ndonjëherë do të vini re se disa variabla janë vendosur në një rresht dhe çdo parametër i ndryshores ndahet me presje. Gjithashtu vini re se variabla është e parashtesuar me @. Në trupin e procedurës, ju mund të vendosni variablin kudo që dëshironi. Për shembull, ndryshorja @ NAME1 mund të deklarohet drejt fundit të trupit të procedurës. Për t'i caktuar një vlerë një variabli të deklaruar, përdoret një grup të dhënash personale. Ndryshe nga një situatë ku deklarohen më shumë se një variabël në një rresht, në një situatë të tillë përdoret vetëm një grup i të dhënave personale.

Shpesh përdoruesit bëjnë pyetjen: "Si të caktoni disa vlera në një deklaratë në trupin e një procedure?" mirë. Një pyetje interesante, por është shumë më e lehtë për t'u bërë nga sa mendoni. Përgjigje: duke përdorur çifte të tilla si "Zgjidh Var = vlerë". Ju mund t'i përdorni këto çifte duke i ndarë me presje.

Nëpërmjet një shumëllojshmërie të gjerë shembujsh, njerëzit tregojnë se si të krijojnë një procedurë të thjeshtë të ruajtur dhe ta ekzekutojnë atë. Megjithatë, një procedurë mund të marrë parametra të tillë që procesi i thirrjes do të ketë vlera afër saj (por jo gjithmonë). Nëse ato përkojnë, atëherë proceset përkatëse fillojnë brenda trupit. Për shembull, nëse krijoni një procedurë që do të pranojë qytetin dhe rajonin nga telefonuesi dhe do të kthejë informacion se sa autorë i përkasin qytetit dhe rajonit përkatës. Rutina do të kërkojë tabelat e autorëve të bazës së të dhënave, për shembull Pubs, për të bërë këtë numërim të autorëve. Për të marrë këto baza të dhënash, për shembull, Google shkarkon skriptin SQL nga faqja SQL2005.

Në shembullin e mëparshëm, procedura merr dy parametra, të cilët në anglisht do të emërtohen në mënyrë konvencionale @State dhe @City. Lloji i të dhënave korrespondon me llojin e përcaktuar në aplikacion. Trupi i procedurës ka variabla të brendshëm @TotalAuthors (autorët total), dhe kjo ndryshore përdoret për të shfaqur numrin e tyre. Më pas, shfaqet seksioni i përzgjedhjes së pyetjeve, i cili llogarit gjithçka. Së fundi, vlera e llogaritur shfaqet në dritaren e daljes duke përdorur një deklaratë printimi.

Si të ekzekutoni një procedurë të ruajtur në SQL

Ka dy mënyra për të përfunduar procedurën. Rruga e parë tregon, duke kaluar parametra, se si ekzekutohet një listë e ndarë me presje pas emrit të procedurës. Le të themi se kemi dy vlera (si në shembullin e mëparshëm). Këto vlera mblidhen duke përdorur parametrat e procedurës @State dhe @City. Rendi është i rëndësishëm në këtë mënyrë të kalimit të parametrave. Kjo metodë quhet kalim rendor i argumenteve. Në metodën e dytë, parametrat tashmë janë caktuar drejtpërdrejt, në këtë rast rendi nuk është i rëndësishëm. Kjo metodë e dytë njihet si kalimi i argumenteve me emër.

Procedura mund të devijojë disi nga ajo tipike. Gjithçka është e njëjtë si në shembullin e mëparshëm, por këtu parametrat janë zhvendosur. Kjo do të thotë, @City ruhet së pari dhe @State ruhet pranë parazgjedhjes. Parametri i paracaktuar zakonisht theksohet veçmas. Procedurat e ruajtura në SQL kalohen vetëm si parametra. Në këtë rast, me kusht që parametri "UT" zëvendëson "CA" të paracaktuar. Në ekzekutimin e dytë, vetëm një vlerë argumenti kalon për parametrin @City dhe parametri @State është i paracaktuar në "CA". Programuesit me përvojë këshillojnë që të gjitha variablat e paracaktuar të jenë afër fundit të listës së parametrave. Përndryshe, ekzekutimi nuk është i mundur, dhe atëherë duhet të punoni me kalimin e argumenteve të emërtuar, gjë që është më e gjatë dhe më e ndërlikuar.

4. Procedurat e ruajtura të SQL Server: Metodat e Kthimit

Ekzistojnë tre mënyra të rëndësishme për të dërguar të dhëna në një procedurë të quajtur të ruajtur. Ato janë renditur më poshtë:

Kthimi i vlerës së një procedure të ruajtur;

Prodhimi i parametrit të procedurës së ruajtur;

Zgjedhja e një prej procedurave të ruajtura.

4.1 Kthimi i vlerave të procedurave të ruajtura të SQL

Në këtë teknikë, procedura i cakton një vlerë një ndryshoreje lokale dhe e kthen atë. Procedura gjithashtu mund të kthejë një vlerë konstante drejtpërdrejt. Në shembullin e mëposhtëm, ne kemi krijuar një procedurë që kthen numrin total të autorëve. Nëse e krahasoni këtë procedurë me ato të mëparshme, mund të shihni se vlera e printimit është e kundërt.

Tani le të shohim se si të ekzekutojmë procedurën dhe të printojmë vlerën e kthimit. Ekzekutimi i procedurës kërkon vendosjen e një variabli dhe printimin, i cili kryhet pas gjithë procesit. Vini re se në vend të një deklarate të printuar, mund të përdorni një deklaratë Select si Select @RetValue dhe OutputValue.

4.2 Dalja e parametrave për procedurat e ruajtura në SQL

Vlera e kthyer mund të përdoret për të kthyer një ndryshore të vetme, siç e pamë në shembullin e mëparshëm. Përdorimi i parametrit Output lejon një procedurë për të dërguar një ose më shumë vlera të ndryshueshme te thirrësi. Parametri i daljes shënohet po njësoj me këtë fjalë kyçe "Output" kur krijoni një procedurë. Nëse një parametër është specifikuar si një parametër i daljes, atëherë objekti i procedurës duhet t'i caktojë një vlerë atij. Procedurat e ruajtura në SQL, shembuj të të cilave mund të shihen më poshtë, kthehen më pas me informacion përmbledhës.

Shembulli ynë do të ketë dy emra dalës: @TotalAuthors dhe @TotalNoContract. Ato tregohen në listën e parametrave. Këtyre variablave u caktohen vlera brenda trupit të procedurës. Kur përdorim jashtë parametrat, thirrësi mund të shohë vlerën e vendosur brenda trupit të procedurës.

Gjithashtu, në skriptin e mëparshëm, deklarohen dy variabla për të parë vlerat që vendosin procedurat e ruajtura të MS SQL Server në parametrin out. Më pas procedura kryhet duke dhënë vlerën normale të parametrit “CA”. Parametrat e mëposhtëm dalin në dalje dhe për këtë arsye ndryshoret e deklaruara kalohen në rendin e specifikuar. Vini re se kur kaloni nëpër ndryshore, këtu vendoset edhe fjala kyçe e daljes. Pasi procedura është e suksesshme, vlerat e kthyera nga parametrat e daljes shfaqen në një kuti mesazhi.

4.3 Zgjedhja e një prej procedurave të ruajtura në SQL

Kjo teknikë përdoret për të kthyer një grup vlerash si tabelë të dhënash (RecordSet) në procedurën e ruajtur të thirrjes. Në këtë shembull SQL, një procedurë e ruajtur me parametrat @AuthID kërkon tabelën Autorët duke filtruar të dhënat e kthyera duke përdorur këtë parametër @AuthId. Deklarata Select vendos se çfarë duhet t'i kthehet thirrësit të procedurës së ruajtur. Kur ekzekutohet procedura e ruajtur, AuthId kalon mbrapsht. Një procedurë e tillë këtu gjithmonë kthen vetëm një rekord, ose asnjë fare. Por procedura e ruajtur nuk ka asnjë kufizim për kthimin e më shumë se një regjistrimi. Nuk është e pazakontë të gjesh shembuj në të cilët kthimi i të dhënave duke përdorur parametra të zgjedhur me pjesëmarrjen e variablave të llogaritur ndodh duke siguruar totale të shumëfishta.

Së fundi

Një procedurë e ruajtur është një pjesë mjaft serioze e softuerit që kthehet ose kalon dhe vendos variablat e kërkuara përmes aplikacionit të klientit. Për shkak se procedura e ruajtur ekzekutohet në vetë serverin, mund të shmangen sasi të mëdha të shkëmbimit të të dhënave midis serverit dhe aplikacionit të klientit (për disa llogaritje). Kjo ju lejon të zvogëloni ngarkesën në serverët SQL, e cila, natyrisht, shkon në duart e mbajtësve të tyre. Procedurat e ruajtura T SQL janë një nga nënspeciet, por studimi i tyre është i nevojshëm për ata që janë të angazhuar në krijimin e bazave të të dhënave mbresëlënëse. Ekziston gjithashtu një numër i madh, madje një numër i madh nuancash që mund të jenë të dobishme gjatë studimit të procedurave të ruajtura, por kjo është e nevojshme më shumë për ata që planifikojnë të përfshihen nga afër në programim, përfshirë profesionalisht.

Artikujt kryesorë të lidhur