Jinsi ya kuandika kwa usahihi taratibu zilizohifadhiwa kwenye Seva ya SQL. Kuunda taratibu zilizohifadhiwa katika seva ya microsoft sql Taratibu zilizohifadhiwa kwenye seva ya sql

  1. Waendeshaji masomo wanaoelezea taratibu zilizohifadhiwa na kanuni za kupitisha vigezo vyao vya pembejeo na matokeo.
  2. Jifunze jinsi ya kuunda na kutatua taratibu zilizohifadhiwa kwenye MS SQL Server 2000.
  3. Tengeneza taratibu tano za msingi zilizohifadhiwa kwa hifadhidata ya mafunzo ya Maktaba.
  4. Andaa ripoti juu ya kazi iliyofanywa kwa fomu ya elektroniki.

1. Kuelewa Taratibu Zilizohifadhiwa

Utaratibu uliohifadhiwa hii ni seti ya amri zilizohifadhiwa kwenye seva na kutekelezwa kama kitengo kimoja. Taratibu zilizohifadhiwa ni utaratibu ambao unaweza kuunda taratibu zinazoendesha kwenye seva na kudhibitiwa na taratibu zake. Taratibu kama hizo zinaweza kuombwa na programu inayoziita. Pia zinaweza kusababishwa na sheria za uadilifu wa data au vichochezi.

Taratibu zilizohifadhiwa zinaweza kurejesha maadili. Utaratibu unaweza kulinganisha maadili yaliyoingizwa na mtumiaji na usanidi wa habari kwenye mfumo. Taratibu zilizohifadhiwa huchukua fursa ya suluhu zenye nguvu za maunzi za Seva ya SQL. Ni msingi wa hifadhidata na hufanya kazi kwa karibu na kiboreshaji cha Seva ya SQL. Hii hukuruhusu kupata utendaji wa juu wakati wa kuchakata data.

Unaweza kupitisha maadili kwa taratibu zilizohifadhiwa na kupokea matokeo kutoka kwao, sio lazima kuhusiana na laha ya kazi. Utaratibu uliohifadhiwa unaweza kuhesabu matokeo kadri inavyoendelea.

Kuna aina mbili za taratibu zilizohifadhiwa: kawaida Na kupanuliwa. Taratibu zilizohifadhiwa za kawaida ni seti ya amri za Transact-SQL, ilhali taratibu zilizopanuliwa zilizohifadhiwa zinawakilishwa kama maktaba ya kiunganishi chenye nguvu (DLL). Taratibu kama hizo, tofauti na zile za kawaida, zina kiambishi awali xp_. Seva ina seti ya kawaida ya taratibu zilizopanuliwa, lakini watumiaji wanaweza kuandika taratibu zao wenyewe katika lugha yoyote ya programu. Jambo kuu ni kutumia interface ya programu API ya SQL Server Open Data Services. Taratibu zilizopanuliwa zilizohifadhiwa zinaweza tu kukaa kwenye hifadhidata ya Mwalimu.

Taratibu zilizohifadhiwa za kawaida pia zinaweza kugawanywa katika aina mbili: kimfumo Na desturi. Taratibu za mfumo hizi ni taratibu za kawaida zinazotumika kuendesha seva; desturi taratibu zozote zilizoundwa na mtumiaji.

1.1. Faida za Taratibu Zilizohifadhiwa

Katika hali ya jumla, taratibu zilizohifadhiwa zina faida zifuatazo:

  • Utendaji wa juu. Ni matokeo ya eneo la taratibu zilizohifadhiwa kwenye seva. Seva, kama sheria, ni mashine yenye nguvu zaidi, kwa hivyo wakati wa utekelezaji wa utaratibu kwenye seva ni chini sana kuliko kwenye kituo cha kazi. Zaidi ya hayo, taarifa ya hifadhidata na utaratibu uliohifadhiwa hukaa kwenye mfumo huo huo, kwa hivyo kuna muda mfupi unaotumika kuhamisha rekodi kwenye mtandao. Taratibu zilizohifadhiwa zina ufikiaji wa moja kwa moja kwa hifadhidata, ambayo hufanya kufanya kazi na habari haraka sana.
  • Faida ya kukuza mfumo katika usanifu wa seva ya mteja. Inajumuisha uwezekano wa kuunda programu ya mteja na seva tofauti. Faida hii ni muhimu katika maendeleo na inaweza kupunguza kwa kiasi kikubwa muda unaohitajika kukamilisha mradi. Nambari inayoendesha kwenye seva inaweza kutengenezwa tofauti na msimbo wa upande wa mteja. Katika kesi hii, vipengele vya upande wa seva vinaweza kushirikiwa na vipengele vya upande wa mteja.
  • Kiwango cha usalama. Taratibu zilizohifadhiwa zinaweza kutumika kama zana ya kuimarisha usalama. Unaweza kuunda taratibu zilizohifadhiwa ambazo hufanya shughuli za kuongeza, kuhariri, kufuta na kuorodhesha, kukupa udhibiti wa kila kipengele cha ufikiaji wa habari.
  • Kuimarisha sheria za seva zinazofanya kazi na data. Hii ni moja ya sababu muhimu zaidi za kutumia injini ya hifadhidata yenye akili. Taratibu zilizohifadhiwa hukuruhusu kutumia sheria na mantiki zingine zinazosaidia kudhibiti habari iliyoingia kwenye mfumo.

Ingawa SQL inafafanuliwa kama lugha isiyo ya kitaratibu, Seva ya SQL hutumia maneno muhimu yanayohusiana na kudhibiti mtiririko wa taratibu. Maneno muhimu kama haya hutumiwa kuunda taratibu ambazo zinaweza kuhifadhiwa kwa utekelezaji wa baadaye. Taratibu zilizohifadhiwa zinaweza kutumika badala ya programu zilizoandikwa katika lugha za kawaida za upangaji (kama vile C au Visual Basic) ambazo hufanya shughuli kwenye hifadhidata ya Seva ya SQL.

Taratibu zilizohifadhiwa hutungwa mara ya kwanza zinapotekelezwa na kuhifadhiwa kwenye jedwali la mfumo katika hifadhidata ya sasa. Wao ni optimized wakati compiled. Hii huchagua njia bora ya kufikia maelezo ya jedwali. Uboreshaji huu unazingatia nafasi halisi ya data kwenye jedwali, faharisi zinazopatikana, mzigo wa jedwali, nk.

Taratibu zilizokusanywa zilizohifadhiwa zinaweza kuboresha utendaji wa mfumo kwa kiasi kikubwa. Inafaa kukumbuka, hata hivyo, kwamba takwimu za data kutoka wakati utaratibu huundwa hadi wakati unatekelezwa zinaweza kupitwa na wakati, na faharasa zinaweza kukosa kufanya kazi. Ingawa unaweza kusasisha takwimu na kuongeza faharisi mpya, zenye ufanisi zaidi, mpango wa utekelezaji wa utaratibu tayari umeandikwa, yaani, utaratibu umeundwa, na matokeo yake njia ya kufikia data inaweza kuwa haifai tena. Kwa hiyo, inawezekana kurejesha taratibu kila wakati wanapoitwa.

Kwa upande mwingine, urejeshaji utachukua muda kila wakati. Kwa hiyo, swali la ufanisi wa kurejesha utaratibu au kuchora mpango wa utekelezaji wake mara moja ni maridadi kabisa na inapaswa kuzingatiwa kwa kila kesi maalum tofauti.

Taratibu zilizohifadhiwa zinaweza kutekelezwa ama kwenye mashine ya ndani au kwenye mfumo wa mbali wa SQL Server. Hii inafanya uwezekano wa kuamsha michakato kwenye mashine zingine na kufanya kazi sio tu na hifadhidata za ndani, lakini pia na habari kwenye seva kadhaa.

Programu zilizoandikwa katika lugha ya kiwango cha juu, kama vile C au Visual Basic .NET, zinaweza pia kuita taratibu zilizohifadhiwa, kutoa usawazishaji bora zaidi wa upakiaji kati ya upande wa mteja na programu ya seva ya SQL.

1.2. Kutengeneza Taratibu Zilizohifadhiwa

Ili kuunda utaratibu uliohifadhiwa, tumia taarifa ya Unda Utaratibu. Jina la utaratibu uliohifadhiwa linaweza kuwa na urefu wa hadi herufi 128, ikijumuisha herufi # na ##. Sintaksia ya ufafanuzi wa utaratibu:

TUNZA PROC procedure_name [; nambari]
[(@data_aina kigezo) [=thamani_chaguo-msingi] ] [,...n]

AS
<Инструкции_SQL>

Wacha tuangalie vigezo vya amri hii:

  • Utaratibu_jina la utaratibu jina; lazima ikidhi sheria za vitambulisho: urefu wake hauwezi kuzidi herufi 128; kwa taratibu za muda za ndani, jina hutanguliwa na ishara #, na kwa taratibu za muda za kimataifa, ishara ## hutumiwa;
  • Nambari Nambari kamili ya hiari inayotumika kupanga taratibu nyingi chini ya jina moja;
  • @parameter data_aina orodha ya majina ya parameta ya utaratibu inayoonyesha aina ya data inayolingana kwa kila; Kunaweza kuwa na hadi vigezo 2100. NULL inaweza kupitishwa kama thamani ya kigezo. Aina zote za data zinaweza kutumika isipokuwa maandishi, ntext na aina za picha. Unaweza kutumia aina ya data ya Mshale kama kigezo cha kutoa (neno kuu la OUTPUT au VARYING). Vigezo vilivyo na aina ya data ya Mshale vinaweza tu kuwa vigezo vya matokeo;
  • KUTOFAUTISHA neno kuu ambalo linabainisha kuwa seti ya matokeo inatumika kama kigezo cha pato (kinachotumika tu kwa aina ya Mshale);
  • OUTPUT inaonyesha kuwa kigezo maalum kinaweza kutumika kama pato;
  • default_value kutumika wakati parameter imeachwa wakati wa kupiga utaratibu; lazima iwe thabiti na inaweza kujumuisha vibambo vya kadi-mwitu (%, _, [, ], ^) na thamani NULL;
  • NA RECOMPILE maneno yanayoonyesha kuwa Seva ya SQL haitaandika mpango wa utaratibu kwenye kashe, lakini itaiunda kila wakati inapotekelezwa;
  • YENYE UFUNGO maneno yanayoonyesha kuwa Seva ya SQL itasimba utaratibu huo kwa njia fiche kabla ya kuuandika kwenye jedwali la mfumo wa Syscomments. Ili kufanya maandishi ya taratibu zilizosimbwa haiwezekani kurejesha, ni muhimu kuondoa nakala zinazofanana kutoka kwa meza ya syscomments baada ya usimbuaji;
  • KWA KURUDISHA maneno muhimu yanayoonyesha kuwa utaratibu huu umeundwa kwa ajili ya urudufishaji tu. Chaguo hili halioani na maneno muhimu ya WITH RECOMPILE;
  • AS mwanzo wa ufafanuzi wa maandishi ya utaratibu;
  • <Инструкции_SQL>seti ya taarifa halali za SQL, iliyopunguzwa tu na ukubwa wa juu wa utaratibu uliohifadhiwa 128 KB. Taarifa zifuatazo ni batili: ALTER DATABASE, ALTER UTARATIBU, ALTER JEDWALI, UTENGENEZA CHAGUO, TUNZA UTARATIBU, ALTER TRIGGER, ALTER VIEW, TENGENEZA DATABASE, TENGENEZA SHERIA, UNDA SCHEMA, CREATE TRIGGER, CREATE VIEW, DSKIN DSKIN ASE, ONDOA CHAGUO-MSINGI, UTARATIBU WA KUONDOA, KANUNI YA KUONDOA, ONDOSHA TRIGGER, DROP VIEW, RESOTRE DATABASE, REJESHA LOG, RENGA UPYA, SASISHA TAKWIMU.

Hebu tuangalie mfano wa utaratibu uliohifadhiwa. Wacha tutengeneze utaratibu uliohifadhiwa ambao unahesabu na kuonyesha idadi ya nakala za vitabu ambazo ziko kwenye maktaba kwa sasa:

TUNZA Utaratibu Hesabu_Ex1
- utaratibu wa kuhesabu idadi ya nakala za vitabu,
- kwa sasa katika maktaba,
- na sio mikononi mwa wasomaji
Kama
-- weka kigezo cha muda cha ndani
Tangaza @N int
Chagua @N = count(*) kutoka kwa Mfano Ambapo Ndiyo_Hapana = "1"
Chagua @N
NENDA

Kwa kuwa utaratibu uliohifadhiwa ni sehemu kamili ya hifadhidata, basi, kama ulivyoelewa tayari, unaweza kuunda utaratibu mpya kwa hifadhidata ya sasa. Wakati wa kufanya kazi katika SQL Server Query Analyzer, kuweka hifadhidata ya sasa inafanywa na Taarifa ya Matumizi ikifuatiwa na jina la hifadhidata ambapo utaratibu uliohifadhiwa utaundwa. Unaweza pia kuchagua hifadhidata ya sasa kwa kutumia orodha kunjuzi.

Baada ya utaratibu uliohifadhiwa kuundwa kwenye mfumo, Seva ya SQL inaikusanya na kukagua taratibu zinazotekelezwa. Ikiwa matatizo yoyote yanatokea, utaratibu unakataliwa. Hitilafu lazima zirekebishwe kabla ya kutuma tena.

SQL Server 2000 hutumia azimio la jina lililochelewa, kwa hivyo ikiwa utaratibu uliohifadhiwa una wito kwa utaratibu mwingine ambao haujatekelezwa, onyo huchapishwa, lakini wito kwa utaratibu ambao haupo huhifadhiwa.

Ukiacha simu kwa utaratibu uliohifadhiwa ambao haujasakinishwa kwenye mfumo, mtumiaji atapokea ujumbe wa hitilafu anapojaribu kuutekeleza.

Unaweza pia kuunda utaratibu uliohifadhiwa kwa kutumia SQL Server Enterprise Manager:

Ili kuangalia utendakazi wa utaratibu uliohifadhiwa, unahitaji kwenda kwa Query Analyzer na uendeshe utaratibu wa kutekelezwa na opereta. EXEC<имя процедуры> . Matokeo ya kuendesha utaratibu tuliounda yanaonyeshwa kwenye Mtini. 4.

Mchele. 4. Kuendesha utaratibu uliohifadhiwa katika Query Analyzer

Mchele. 5. Matokeo ya kutekeleza utaratibu bila operator wa kuonyesha

1.3. Vigezo vya Utaratibu uliohifadhiwa

Taratibu zilizohifadhiwa ni chombo chenye nguvu sana, lakini ufanisi wa juu unaweza kupatikana tu kwa kuwafanya kuwa na nguvu. Msanidi programu lazima aweze kupitisha maadili ya utaratibu uliohifadhiwa ambayo itafanya kazi, ambayo ni, vigezo. Chini ni kanuni za msingi za kutumia vigezo katika taratibu zilizohifadhiwa.

  • Unaweza kufafanua vigezo moja au zaidi kwa utaratibu.
  • Vigezo hutumika kama maeneo yaliyotajwa kuhifadhi data, kama vile vigeu katika lugha za programu kama vile C, Visual Basic .NET.
  • Jina la kigezo lazima litanguliwe na alama ya @.
  • Majina ya parameta ni ya kawaida kwa utaratibu ambapo yamefafanuliwa.
  • Vigezo hutumiwa kupitisha habari kwa utaratibu wakati unatekelezwa. Wataonekana kwenye mstari wa amri baada ya jina la utaratibu.
  • Ikiwa utaratibu una vigezo kadhaa, hutenganishwa na koma.
  • Kuamua aina ya habari iliyopitishwa kama kigezo, aina za data za mfumo au mtumiaji hutumiwa.

Chini ni ufafanuzi wa utaratibu ambao una parameter moja ya pembejeo. Wacha tubadilishe kazi iliyotangulia na tuhesabu sio nakala zote za vitabu, lakini nakala za kitabu maalum. Vitabu vyetu vinatambuliwa kwa pekee na ISBN ya kipekee, kwa hiyo tutapitisha parameter hii kwa utaratibu. Katika kesi hii, maandishi ya utaratibu uliohifadhiwa yatabadilika na yataonekana kama hii:

Unda Utaratibu Hesabu_Ex(@ISBN varchar(14))
Kama
Tangaza @N int
Chagua @N
NENDA

Tunapozindua utaratibu huu wa utekelezaji, lazima tuipitishe thamani ya parameter ya pembejeo (Mchoro 6).

Mchele. 6. Kuanza utaratibu kwa kupitisha parameter

Ili kuunda matoleo mengi ya utaratibu sawa ambayo yana jina sawa, fuata jina la msingi na nusu koloni na nambari kamili. Jinsi ya kufanya hivyo inavyoonyeshwa katika mfano unaofuata, unaoelezea jinsi ya kuunda taratibu mbili kwa jina moja lakini kwa nambari tofauti za toleo (1 na 2). Nambari hutumika kudhibiti ni toleo gani la utaratibu huu linatekelezwa. Ikiwa hakuna nambari ya toleo iliyotajwa, toleo la kwanza la utaratibu linatekelezwa. Chaguo hili halijaonyeshwa katika mfano uliopita, lakini bado linapatikana kwa programu yako.

Taratibu zote mbili hutumia taarifa ya uchapishaji ili kuchapisha ujumbe unaotambulisha toleo. Toleo la kwanza linahesabu idadi ya nakala za bure, na la pili idadi ya nakala zilizo mkononi kwa kitabu fulani.

Maandishi ya matoleo yote mawili ya taratibu yametolewa hapa chini:

TUNZA Utaratibu Hesabu_Ex_yote; 1
(@ISBN varchar(14))
-- utaratibu wa kuhesabu nakala za bure za kitabu fulani
Kama
Tangaza @N int
Chagua @N = count(*) kutoka kwa Mfano Ambapo ISBN = @ISBN na Ndiyo_No = "1"
Chagua @N
--
NENDA
--
TUNZA Utaratibu Hesabu_Ex_yote; 2
(@ISBN varchar(14))
-- utaratibu wa kuhesabu nakala za bure za kitabu fulani
Kama
Tangaza @N1 int
Chagua @N1 = count(*) kutoka kwa Mfano Ambapo ISBN = @ISBN na Ndiyo_No = "0"
Chagua @N1
NENDA

Matokeo ya kufanya utaratibu na matoleo tofauti yanaonyeshwa kwenye Mtini. 7.

Mchele. 7. Matokeo ya kuendesha matoleo tofauti ya utaratibu sawa uliohifadhiwa

Unapoandika matoleo mengi, kumbuka vizuizi vifuatavyo: Kwa kuwa matoleo yote ya utaratibu yamekusanywa pamoja, vigeuzo vyote vya ndani vinazingatiwa kuwa pamoja. Kwa hiyo, ikiwa hii inahitajika na algorithm ya usindikaji, ni muhimu kutumia majina tofauti ya vigezo vya ndani, ambayo ni nini tulifanya kwa kuita variable @N katika utaratibu wa pili na jina @N1.

Taratibu tulizoandika hazirudishi paramu moja, zinaonyesha tu nambari inayotokana kwenye skrini. Walakini, mara nyingi tunahitaji kupata parameta kwa usindikaji zaidi. Kuna njia kadhaa za kurejesha vigezo kutoka kwa utaratibu uliohifadhiwa. Rahisi zaidi ni kutumia operator wa RETURN. Opereta huyu atarudisha thamani moja ya nambari. Lakini lazima tueleze jina la kutofautisha au usemi ambao umepewa parameta ya kurudi. Zifuatazo ni thamani zilizorejeshwa na taarifa ya RETURN na zimehifadhiwa na mfumo:

Kanuni Maana
0 Kila kitu kiko sawa
1 Kipengee hakijapatikana
2 Hitilafu ya aina ya data
3 Mchakato huo ulikua mwathirika wa msuguano
4 hitilafu ya ufikiaji
5 Hitilafu ya kisintaksia
6 Hitilafu fulani
7 Hitilafu na rasilimali (hakuna nafasi)
8 Hitilafu ya ndani inayoweza kurejeshwa imetokea
9 Kikomo cha mfumo kimefikiwa
10 Ukiukaji usioweza kurekebishwa wa uadilifu wa ndani
11 Sawa
12 Uharibifu wa jedwali au index
13 Uharibifu wa hifadhidata
14 Hitilafu ya maunzi

Kwa hivyo, ili kuwa sawa na mfumo, tunaweza tu kurudisha nambari chanya kupitia parameta hii.

Kwa mfano, tunaweza kubadilisha maandishi ya utaratibu uliohifadhiwa ulioandikwa hapo awali Count_ex kama ifuatavyo:

Unda Utaratibu Hesabu_Ex2(@ISBN varchar(14))
Kama
Tangaza @N int
Chagua @N = count(*) kutoka kwa Mfano
Ambapo ISBN = @ISBN na YES_NO = "1"
-- rudisha thamani ya @N variable,
-- ikiwa thamani ya kutofautisha haijafafanuliwa, rudisha 0
Return Coalesce(@N, 0)
NENDA

Sasa tunaweza kupata thamani ya @N kutofautisha na kuitumia kwa usindikaji zaidi. Katika kesi hii, thamani ya kurudi imepewa utaratibu uliohifadhiwa yenyewe, na ili kuichanganua, unaweza kutumia utaratibu ufuatao wa muundo wa taarifa ya simu:

Ex<переменная> = <имя_процедуры> <значение_входных_параметров>

Mfano wa kupiga simu utaratibu wetu umeonyeshwa kwenye Mtini. 8.

Mchele. 8. Kupitisha thamani ya kurudi kwa utaratibu uliohifadhiwa kwa kutofautiana kwa ndani

Vigezo vya uingizaji wa utaratibu uliohifadhiwa vinaweza kutumia thamani chaguo-msingi. Thamani hii itatumika ikiwa thamani ya parameta haikuainishwa wakati wa kupiga utaratibu.

Thamani chaguo-msingi imebainishwa kwa kutumia ishara sawa baada ya maelezo ya kigezo cha pembejeo na aina yake. Fikiria utaratibu uliohifadhiwa unaohesabu idadi ya nakala za vitabu vya mwaka fulani wa kuchapishwa. Mwaka chaguo-msingi wa kutolewa ni 2006.

UNDA UTARATIBU ex_books_now(@year int = 2006)
-- kuhesabu idadi ya nakala za vitabu vya mwaka fulani wa kuchapishwa
AS
Tangaza @N_books int
chagua @N_books = count(*) kutoka kwa vitabu, mfano
ambapo Books.ISBN = exemplar.ISBN na YEARIZD = @year
return coalesce(@N_books, 0)
NENDA

Katika Mtini. Mchoro wa 9 unaonyesha mfano wa kuita utaratibu huu na bila kutaja kigezo cha pembejeo.

Mchele. 9. Kuita utaratibu uliohifadhiwa na bila parameter

Mifano zote hapo juu za kutumia vigezo katika taratibu zilizohifadhiwa zilitoa vigezo vya pembejeo tu. Walakini, vigezo vinaweza pia kuwa pato. Hii ina maana kwamba thamani ya parameter baada ya utaratibu kukamilika itapitishwa kwa mtu aliyeita utaratibu huu (utaratibu mwingine, trigger, mfuko wa amri, nk). Kwa kawaida, ili kupokea parameter ya pato, wakati wa kupiga simu, unapaswa kutaja si mara kwa mara, lakini kutofautiana kama parameter halisi.

Kumbuka kuwa kufafanua parameta kama parameta ya pato katika utaratibu haukulazimishi kuitumia hivyo. Hiyo ni, ikiwa utataja mara kwa mara kama parameta halisi, basi hakuna hitilafu itatokea na itatumika kama paramu ya kawaida ya pembejeo.

Ili kuonyesha kwamba parameter ni pato, taarifa ya OUTPUT hutumiwa. Neno kuu hili limeandikwa baada ya maelezo ya parameta. Wakati wa kuelezea vigezo vya taratibu zilizohifadhiwa, inashauriwa kutaja maadili ya vigezo vya pato baada ya zile za pembejeo.

Hebu tuangalie mfano wa kutumia vigezo vya pato. Wacha tuandike utaratibu uliohifadhiwa ambao, kwa kitabu fulani, huhesabu jumla ya nakala zake kwenye maktaba na idadi ya nakala za bure. Hatutaweza kutumia taarifa ya RETURN hapa kwa sababu inaleta thamani moja pekee, kwa hivyo tunahitaji kufafanua vigezo vya matokeo hapa. Maandishi ya utaratibu uliohifadhiwa yanaweza kuonekana kama hii:

TUNZA Utaratibu wa Hesabu_vitabu_vyote
(@ISBN varchar(14), @matokeo yote ya ndani, @toto la bure la int)
-- utaratibu wa kuhesabu jumla ya idadi ya nakala za kitabu fulani
-- na idadi ya nakala za bure
Kama
-- kuhesabu jumla ya idadi ya nakala
Chagua @all = count(*) kutoka kwa Mfano Ambapo ISBN = @ISBN
Chagua @free = count(*) kutoka kwa Mfano Ambapo ISBN = @ISBN na Ndiyo_No = "1"
NENDA

Mfano wa utaratibu huu unaonyeshwa kwenye Mtini. 10.

Mchele. 10. Kujaribu utaratibu uliohifadhiwa na vigezo vya pato

Kama ilivyoelezwa hapo awali, ili kupata maadili ya vigezo vya pato kwa uchambuzi, lazima tuziweke kwa vigezo, na vigezo hivi lazima vielezewe na operator wa Declare. Taarifa ya mwisho ya pato ilituruhusu kuchapisha tu maadili yanayotokana na skrini.

Vigezo vya utaratibu vinaweza hata kuwa anuwai ya aina Cursor . Ili kufanya hivyo, kutofautisha lazima kufafanue kama aina maalum ya data ya VARYING, bila kujifunga kwa aina za data za mfumo. Kwa kuongeza, ni lazima ionyeshe kuwa hii ni tofauti ya aina Mshale .

Hebu tuandike utaratibu rahisi unaoonyesha orodha ya vitabu katika maktaba yetu. Kwa kuongezea, ikiwa hakuna zaidi ya vitabu vitatu, basi tunaonyesha majina yao ndani ya utaratibu yenyewe, na ikiwa orodha ya vitabu inazidi nambari iliyoainishwa, basi tunaipitisha kama mshale kwa programu ya kupiga simu au moduli.

Nakala ya utaratibu inaonekana kama hii:

TENGENEZA UTARATIBU WA GET3TITLES
(@MYCURSOR CURSOR OUTPUT INAYOTOFAUTIANA)
-- utaratibu wa kuchapisha vichwa vya vitabu kwa mshale
AS
-- fafanua tofauti ya ndani ya aina ya Mshale katika utaratibu
WEKA @MYCURSOR = MSHALE
KWA KICHWA CHAGUA KALI
KUTOKA VITABU
-- fungua mshale
FUNGUA @MYCURSOR
-- eleza vigeu vya ndani vya ndani
TANGAZA @TITLE VARCHAR(80), @CNT INT
--- weka hali ya awali ya kaunta ya vitabu
WEKA @CNT = 0
-- nenda kwenye mstari wa kwanza wa mshale
-- wakati kuna mistari ya mshale,
-- yaani, mradi mpito kwa mstari mpya ni sahihi
WAKATI (@FETCH_STATUS = 0) NA (@CNT<= 2) BEGIN
CHAPISHA @TITLE
FUATA INAYOFUATA KUTOKA KWA @MYCURSOR KWENYE @TITLE
-- badilisha hali ya kaunta ya vitabu
WEKA @CNT = @CNT + 1
MWISHO
IF @CNT = 0 CHAPIA "HAKUNA VITABU VINAVYOFANANA"
NENDA

Mfano wa kuita utaratibu huu uliohifadhiwa umeonyeshwa kwenye Mtini. kumi na moja.

Katika utaratibu wa kupiga simu, kielekezi lazima kitangaze kama kibadilishaji cha ndani. Kisha tukaita utaratibu wetu na kuupitisha jina la kibadilishaji cha ndani cha aina ya Mshale. Utaratibu ulianza kufanya kazi na kuonyeshwa majina matatu ya kwanza kwenye skrini, na kisha kuhamisha udhibiti kwa utaratibu wa kupiga simu, na iliendelea kusindika mshale. Ili kufanya hivyo, alipanga kitanzi cha Wakati kwa kutumia utofautishaji wa kimataifa @@FETCH_STATUS, ambao hufuatilia hali ya kielekezi, na kisha kwenye kitanzi akaonyesha mistari mingine yote ya mshale.

Katika dirisha la pato tunaona kuongezeka kwa nafasi kati ya mistari mitatu ya kwanza na vichwa vinavyofuata. Muda huu unaonyesha tu kwamba udhibiti umehamishiwa kwenye programu ya nje.

Kumbuka kuwa kibadilishaji cha @TITLE, kikiwa ndani ya utaratibu, kitaharibiwa kitakapokamilika, kwa hivyo kitatangazwa tena kwenye kizuizi kinachoita utaratibu huo. Uumbaji na ufunguzi wa mshale katika mfano huu hutokea kwa utaratibu, na kufunga, uharibifu, na usindikaji wa ziada hufanyika katika kuzuia amri ambayo utaratibu unaitwa.

Njia rahisi zaidi ya kuona maandishi ya utaratibu, kubadilisha au kufuta ni kutumia kiolesura cha picha cha Meneja wa Biashara. Lakini pia unaweza kufanya hivyo kwa kutumia taratibu maalum zilizohifadhiwa za mfumo wa Transact-SQL. Katika Transact-SQL, unaweza kuona ufafanuzi wa utaratibu kwa kutumia utaratibu wa mfumo wa sp_helptext, na unaweza kutumia utaratibu wa mfumo wa sp_help kuonyesha maelezo ya udhibiti kuhusu utaratibu. Taratibu za mfumo wa sp_helptext na sp_help pia hutumika kutazama vipengee vya hifadhidata kama vile majedwali, sheria na mipangilio chaguomsingi.

Taarifa kuhusu matoleo yote ya utaratibu mmoja, bila kujali namba, huonyeshwa mara moja. Kufuta matoleo tofauti ya utaratibu huo uliohifadhiwa pia hutokea wakati huo huo. Mfano ufuatao unaonyesha jinsi ufafanuzi wa toleo la 1 na toleo la 2 la Count_Ex_all huchapishwa wakati jina lake limebainishwa kama kigezo cha utaratibu wa mfumo wa sp_helptext (Mchoro 12).

Mchele. 12. Kuangalia maandishi ya utaratibu uliohifadhiwa kwa kutumia utaratibu uliohifadhiwa wa mfumo

Utaratibu wa mfumo SP_HELP unaonyesha sifa na vigezo vya utaratibu ulioundwa katika fomu ifuatayo:

Jina
Mmiliki
Aina
Tarehe_iliyoundwa
Hesabu_vitabu_vyote
dbo
utaratibu uliohifadhiwa
2006-12-06 23:15:01.217
Parameta_name
Aina
Urefu Prec.
Mizani Param_order Collation
@ISBN
vachar
14 14
NULL 1 Kisiriliki_Jumla_CI_AS
@wote
int
4 10
0 2 NULL
@bure
int
4 10
0 3 NULL

Jaribu kufafanua vigezo hivi mwenyewe. Wanazungumza nini?

1.4. Kuandaa Utaratibu Uliohifadhiwa

Faida ya kutumia taratibu zilizohifadhiwa kutekeleza seti ya taarifa za Transact-SQL ni kwamba zinakusanywa mara ya kwanza zinapotekelezwa. Wakati wa mchakato wa ujumuishaji, taarifa za Transact-SQL hubadilishwa kutoka kwa uwakilishi wao wa asili wa ishara hadi fomu inayoweza kutekelezwa. Vitu vyovyote vinavyopatikana katika utaratibu pia hubadilishwa kuwa uwakilishi mbadala. Kwa mfano, majina ya jedwali hubadilishwa kuwa vitambulishi vya kitu, na majina ya safu wima hubadilishwa kuwa vitambulishi vya safu wima.

Mpango wa utekelezaji umeundwa kwa njia sawa na ya kutekeleza taarifa moja ya Transact-SQL. Mpango huu una, kwa mfano, faharisi zinazotumiwa kusoma safu kutoka kwa majedwali yaliyofikiwa na utaratibu. Mpango wa utekelezaji wa utaratibu huhifadhiwa kwenye kashe na hutumiwa kila wakati unapoitwa.

Kumbuka: Akiba ya utaratibu inaweza kuwekewa ukubwa ili kujumuisha zaidi au taratibu zote zinazopatikana za utekelezaji. Hii itaokoa muda unaohitajika ili kuunda upya mpango wa utaratibu.

1.5. Urejeshaji otomatiki

Kawaida mpango wa utekelezaji iko kwenye cache ya utaratibu. Hii inakuwezesha kuongeza utendaji wa utekelezaji wake. Walakini, chini ya hali zingine, utaratibu unarudiwa kiatomati.

  • Utaratibu unarudishwa kila wakati SQL Server inapoanza. Kawaida hii hutokea baada ya mfumo wa uendeshaji kuanza upya na mara ya kwanza utaratibu unafanywa baada ya kuundwa.
  • Mpango wa utekelezaji wa utaratibu kila mara hukusanywa kiotomatiki ikiwa faharasa kwenye jedwali inayofikiwa na utaratibu imetupwa. Kwa sababu mpango wa sasa unafikia faharasa ambayo haipo tena ili kusoma safu mlalo za jedwali, mpango mpya wa utekelezaji lazima uundwe. Hoja za utaratibu zitatekelezwa iwapo tu zitasasishwa.
  • Mkusanyiko wa mpango wa utekelezaji pia hutokea ikiwa mtumiaji mwingine kwa sasa anafanya kazi na mpango huu ulio kwenye kache. Nakala ya mtu binafsi ya mpango wa utekelezaji imeundwa kwa mtumiaji wa pili. Ikiwa nakala ya kwanza ya mpango haikuwa na kazi nyingi, hakutakuwa na haja ya kuunda nakala ya pili. Mtumiaji anapokamilisha utaratibu, mpango wa utekelezaji unapatikana kwenye akiba kwa mtumiaji mwingine ambaye ana ruhusa inayofaa ya ufikiaji.
  • Utaratibu hurudiwa kiotomatiki ikiwa utafutwa na kuundwa upya. Kwa sababu utaratibu mpya unaweza kuwa tofauti na toleo la zamani, nakala yoyote ya mpango wa utekelezaji katika cache huondolewa na mpango huo unarudiwa.

Seva ya SQL inajitahidi kuboresha taratibu zilizohifadhiwa kwa kuakibisha taratibu zinazotumiwa sana. Kwa hivyo, mpango wa zamani wa utekelezaji uliopakiwa kwenye kashe unaweza kutumika badala ya mpango mpya. Ili kuzuia tatizo hili, unapaswa kufuta na kuunda upya utaratibu uliohifadhiwa, au kuacha na kuanzisha upya Seva ya SQL. Hii itafuta cache ya utaratibu na kuondoa uwezekano wa kufanya kazi na mpango wa zamani wa utekelezaji.

Utaratibu unaweza pia kuundwa na chaguo la NA RECOMPILE. Katika kesi hii, itakusanywa kiotomatiki kila wakati inapotekelezwa. Chaguo la WITH RECOMPILE linapaswa kutumika katika hali ambapo utaratibu unafikia majedwali yenye nguvu sana ambayo safu mlalo zao huongezwa, kufutwa au kusasishwa mara kwa mara, kwa kuwa hii husababisha mabadiliko makubwa kwa faharasa zilizofafanuliwa kwenye jedwali.

Ikiwa taratibu hazijajumuishwa kiotomatiki, unaweza kuzilazimisha kufanya hivyo. Kwa mfano, ikiwa takwimu zinazotumiwa kubainisha ikiwa faharasa inaweza kutumika katika hoja fulani itasasishwa, au ikiwa faharasa mpya itaundwa, ujumuishaji wa kulazimishwa lazima ufanyike. Ili kulazimisha urejeshaji, tumia kifungu cha WITH RECOMPILE katika taarifa ya EXECUTE:

TIMIZA utaratibu_jina;
AS
<инструкции Transact-SQL>
NA RECOMPILE

Ikiwa utaratibu unafanya kazi na vigezo vinavyodhibiti utaratibu ambao unatekelezwa, unapaswa kutumia chaguo la WITH RECOMPILE. Ikiwa vigezo vya utaratibu uliohifadhiwa vinaweza kuamua njia bora ya kuutekeleza, inashauriwa uunde mpango wa utekelezaji unapouendesha, badala ya kuunda mara ya kwanza unapoita utaratibu wa matumizi katika simu zote zinazofuata.

Kumbuka: Wakati mwingine inaweza kuwa vigumu kuamua ikiwa utatumia WITH RECOMPILE chaguo wakati wa kuunda utaratibu au la. Ikiwa una shaka, ni bora kutotumia chaguo hili, kwa kuwa kurejesha utaratibu kila wakati unapotekelezwa utapoteza muda wa thamani sana wa CPU. Ikiwa unahitaji kurejesha utaratibu uliohifadhiwa katika siku zijazo, unaweza kufanya hivyo kwa kuongeza kifungu cha WITH RECOMPILE kwenye taarifa ya KUTEKELEZA.

Huwezi kutumia chaguo la NA RECOMPILE katika taarifa ya UTARATIBU WA KUUNDA ambayo ina chaguo la KWA KUNAGA. Tumia chaguo hili kuunda utaratibu unaofanya kazi wakati wa mchakato wa kurudia.

1.6. Nesting ya taratibu zilizohifadhiwa

Taratibu zilizohifadhiwa zinaweza kuita taratibu zingine zilizohifadhiwa, lakini kuna kikomo juu ya kiwango cha kuota. Kiwango cha juu cha kutagia viota ni 32. Kiwango cha sasa cha kutagia kinaweza kubainishwa kwa kutumia @@NESTLEVEL tofauti ya kimataifa.

2. Kazi Zilizobainishwa na Mtumiaji (UDF)

MS SQL SERVER 2000 ina vitendaji vingi vilivyoainishwa awali vinavyokuruhusu kufanya vitendo mbalimbali. Hata hivyo, kunaweza kuwa na haja ya kutumia baadhi ya vipengele maalum. Ili kufanya hivyo, kuanzia toleo la 8.0 (2000), iliwezekana kuelezea kazi zilizoainishwa na mtumiaji (UDF) na kuzihifadhi kama kitu kamili cha hifadhidata, pamoja na taratibu zilizohifadhiwa, maoni, nk.

Urahisi wa kutumia kazi zilizoainishwa na mtumiaji ni dhahiri. Tofauti na taratibu zilizohifadhiwa, chaguo za kukokotoa zinaweza kupachikwa moja kwa moja katika taarifa SELECT, na zinaweza kutumika kupata thamani mahususi (katika kifungu cha SELECT) na kama chanzo cha data (katika kifungu cha FROM).

Wakati wa kutumia UDF kama vyanzo vya data, faida yao juu ya maoni ni kwamba UDF, tofauti na mitazamo, zinaweza kuwa na vigezo vya ingizo vinavyoweza kutumika kuathiri matokeo ya chaguo la kukokotoa.

Vitendaji vilivyoainishwa na mtumiaji vinaweza kuwa vya aina tatu: kazi za scalar, kazi za ndani Na kazi za taarifa nyingi zinazorudisha matokeo ya jedwali. Hebu tuangalie kwa karibu aina hizi zote za kazi.

2.1. Kazi za Scalar

Vitendo vya kukokotoa hurejesha tokeo moja la alama. Matokeo haya yanaweza kuwa yoyote kati ya aina zilizoelezwa hapo juu, isipokuwa kwa maandishi, maandishi, picha na aina za muhuri wa muda. Hii ndiyo aina rahisi zaidi ya kazi. Syntax yake ni kama ifuatavyo:


INARUDISHA aina_ya_data_ya_data

ANZA
kazi_ya_mwili
RUDISHA usemi_wa_kavu
MWISHO

  • Kigezo cha ENCRYPTION tayari kimeelezwa katika sehemu ya taratibu zilizohifadhiwa;
  • SCHEMABINDING hufunga chaguo za kukokotoa kwa utaratibu. Hii ina maana kwamba huwezi kufuta majedwali au maoni ambayo chaguo la kukokotoa linategemea bila kufuta au kurekebisha chaguo la kukokotoa lenyewe. Pia huwezi kubadilisha muundo wa jedwali hizi ikiwa sehemu inayobadilishwa inatumiwa na chaguo za kukokotoa. Kwa hivyo, chaguo hili hukuruhusu kuondoa hali ambapo kazi hutumia meza au maoni fulani, na mtu, bila kujua, aliifuta au kuibadilisha;
  • INARUDISHA aina_ya_data_ya_data inaelezea aina ya data ambayo kazi inarudi;
  • msemo_wa_kucha usemi unaorudisha moja kwa moja matokeo ya chaguo la kukokotoa. Ni lazima iwe ya aina sawa na ile iliyoelezwa baada ya KURUDI;
  • function_body seti ya maagizo ya Transact-SQL.

Wacha tuangalie mifano ya kutumia kazi za scalar.

Unda chaguo za kukokotoa ambazo zitachagua nambari ndogo kabisa kati ya nambari mbili kamili zinazotolewa kama ingizo kama vigezo.

Acha kazi ionekane kama hii:

UNDA FUNCTION min_num(@a INT, @b INT)
INAREJESHA INT
ANZA
TANGAZA @c INT
IF @a< @b SET @c = @a
VINGINEVYO WEKA @c = @b
RUDI @c
MWISHO

Wacha sasa tutekeleze utendakazi huu:

CHAGUA dbo.min_num(4, 7)

Kama matokeo, tunapata thamani 4.

Unaweza kutumia chaguo hili kupata maadili madogo kabisa ya safu wima ya jedwali:

CHAGUA min_lvl, max_lvl, min_num(min_lvl, max_lvl)
KUTOKA Ajira

Wacha tuunde chaguo la kukokotoa ambalo litapokea kigezo cha aina ya tarehe kama ingizo na turudishe tarehe na saa inayolingana na mwanzo wa siku iliyobainishwa. Kwa mfano, ikiwa kigezo cha pembejeo ni 09.20.03 13:31, basi matokeo yatakuwa 09.20.03 00:00.

TENGENEZA KAZI dbo.daybegin(@dat DATETIME)
RUDISHA wakati mdogo AS
ANZA
RUDISHA BADILISHA(tarehe, FLOOR(badilisha(FLOAT, @dat)))
MWISHO

Hapa kazi ya CONVERT hufanya ubadilishaji wa aina. Kwanza, aina ya tarehe inatupwa kwa FLOAT. Kwa upunguzaji huu, sehemu kamili ni idadi ya siku zinazohesabiwa kutoka Januari 1, 1900, na sehemu ya sehemu ni wakati. Ifuatayo, inazungushwa hadi nambari kamili ndogo kwa kutumia chaguo la kukokotoa la FLOOR na kubadilishwa kuwa aina ya tarehe.

Wacha tuangalie kazi:

CHAGUA dbo.daybegin(GETDATE())

Hapa GETDATE() ni chaguo la kukokotoa ambalo linarudisha tarehe na saa ya sasa.

Chaguo za kukokotoa za awali zilitumia tu vigezo vya kuingiza katika hesabu zao. Walakini, unaweza pia kutumia data iliyohifadhiwa kwenye hifadhidata.

Hebu tuunde chaguo la kukokotoa ambalo litachukua tarehe mbili kama vigezo: mwanzo na mwisho wa muda na tuhesabu jumla ya mapato ya mauzo ya muda huu. Tarehe ya mauzo na kiasi kitachukuliwa kutoka kwa jedwali la Mauzo, na bei za hati zinazouzwa zitachukuliwa kutoka kwa jedwali la Mada.

TUNZA KAZI dbo.SumSales(@datebegin DATETIME, @dateend DATETIME)
RUDISHA Pesa
AS
ANZA
TANGAZA @Jumla ya Pesa
CHAGUA @Jumla = jumla (t.bei * s.qty)

RUDI @Jumla
MWISHO

2.2. Vitendaji vya ndani

Aina hii ya chaguo za kukokotoa inarejesha kama matokeo si thamani ya kadiri, lakini jedwali, au tuseme seti ya data. Hii inaweza kuwa rahisi sana katika hali ambapo aina moja ya subquery mara nyingi hutekelezwa kwa taratibu tofauti, vichochezi, nk. Kisha, badala ya kuandika swali hili kila mahali, unaweza kuunda chaguo za kukokotoa na kuitumia katika siku zijazo.

Kazi za aina hii zinafaa zaidi katika hali ambapo unataka jedwali lililorejeshwa litegemee vigezo vya pembejeo. Kama unavyojua, maoni hayawezi kuwa na vigezo, kwa hivyo vitendaji vya ndani tu vinaweza kutatua shida ya aina hii.

Upekee wa kazi za ndani ni kwamba zinaweza kuwa na ombi moja tu katika miili yao. Kwa hivyo, kazi za aina hii ni sawa na maoni, lakini zinaweza kuwa na vigezo vya pembejeo. Sintaksia ya utendakazi wa ndani:

UNDA KAZI [mmiliki.]function_name
([(@parameter_name scalar_data_type [=thamani_chaguo-msingi]) [, n]])
MEZA YA KURUDISHA

RUDI [(<запрос>)]

Ufafanuzi wa kazi unasema kwamba itarudisha meza;<запрос>hii ndiyo ombi, matokeo ambayo yatakuwa matokeo ya kazi.

Hebu tuandike kazi sawa na kazi ya scalar kutoka kwa mfano wa mwisho, lakini kurejea sio tu matokeo ya muhtasari, lakini pia safu za mauzo, ikiwa ni pamoja na tarehe ya kuuza, kichwa cha kitabu, bei, idadi ya vipande na kiasi cha mauzo. Mauzo yale tu ambayo yanaanguka ndani ya muda uliowekwa ndio yanapaswa kuchaguliwa. Wacha tusimbe maandishi ya kazi ili watumiaji wengine waweze kuitumia, lakini hawawezi kuisoma na kuirekebisha:

UTENGENEZA Kipindi_cha_Mauzo (@datebegin DATETIME, @dateend DATETIME)
MEZA YA KURUDISHA
YENYE SIMBO
AS
RUDI (
CHAGUA t.title, t.bei, s.qty, ord_date, t.price * s.qty kama stoim
KUTOKA kwa Majina JIUNGE NA Mauzo KWENYE t.title_Id = s.Title_ID
WAPI ord_date KATI YA @datebegin na @dateend
)

Sasa hebu tuite kazi hii. Kama ilivyotajwa tayari, inaweza kuitwa tu katika FROM kifungu cha taarifa SELECT:

CHAGUA * KUTOKA Kipindi_cha_Mauzo("09/01/94", "09/13/94")

2.3. Vipengele vingi vya kukokotoa vinavyorudisha matokeo ya jedwali

Aina ya kwanza ya chaguo za kukokotoa zinazozingatiwa ziliruhusu utumizi wa taarifa nyingi za Transact-SQL kama inavyotarajiwa, lakini zilileta matokeo ya vipimo pekee. Aina ya pili ya chaguo za kukokotoa inaweza kurudisha majedwali, lakini mwili wake unawakilisha swali moja tu. Kazi za taarifa nyingi zinazorudisha matokeo ya jedwali hukuruhusu kuchanganya sifa za kazi mbili za kwanza, yaani, zinaweza kuwa na taarifa nyingi za Transact-SQL kwenye mwili na kurudisha jedwali kama matokeo. Sintaksia ya utendakazi wa taarifa nyingi:

UNDA KAZI [mmiliki.]function_name
([(@parameter_name scalar_data_type [=thamani_chaguo-msingi]) [,... n]])
INARUDISHA @tokeo variable_name TABLE
<описание_таблицы>

ANZA
<тело_функции>
RUDISHA
MWISHO

  • JEDWALI<описание_таблицы> inaelezea muundo wa meza iliyorejeshwa;
  • <описание_таблицы> ina orodha ya safu wima na vikwazo.

Sasa hebu tuangalie mfano ambao unaweza tu kufanywa kwa kutumia kazi za aina hii.

Hebu kuwe na mti wa saraka na faili zilizomo ndani yao. Hebu muundo huu wote uelezewe katika hifadhidata kwa namna ya meza (Mchoro 13). Kimsingi, hapa tunayo muundo wa kihierarkia kwa saraka, kwa hivyo mchoro unaonyesha uhusiano wa jedwali la Folda yenyewe.

Mchele. 13. Muundo wa hifadhidata kuelezea safu ya faili na saraka

Sasa hebu tuandike kazi ambayo itachukua kitambulisho cha saraka kama ingizo na kutoa faili zote ambazo zimehifadhiwa ndani yake na katika saraka zote chini ya safu. Kwa mfano, ikiwa saraka Kitivo1, Kitivo2, n.k. zimeundwa kwenye saraka ya Taasisi, zina saraka za idara, na kila saraka ina faili, basi tunapotaja kitambulisho cha saraka ya Taasisi kama paramu ya kazi yetu, orodha ya faili zote. kwa saraka hizi zote. Kwa kila faili, jina, saizi na tarehe ya uundaji inapaswa kuonyeshwa.

Tatizo haliwezi kutatuliwa kwa kutumia kitendakazi cha ndani, kwani SQL haijaundwa kufanya maswali ya kihierarkia, kwa hivyo swala moja la SQL haitoshi. Kazi ya scalar haiwezi kutumika pia, kwani matokeo lazima iwe meza. Hapa ndipo utendaji wa kauli nyingi unaorudisha jedwali utatusaidia:

TUNZA KAZI dbo.GetFiles(@Folder_ID int)
INARUDISHA @files TABLE(Jina VARCHAR(100), Tarehe_Create DATETIME, FileSize INT) AS
ANZA
TANGAZA @tmp TABLE(Folder_Id int)
TANGAZA @Cnt INT
INGIA NDANI ya thamani za @tmp(@Folder_ID)
WEKA @Cnt = 1
WAKATI @Cnt<>0 ANZA
WEKA NDANI YA @tmp CHAGUA Folda_Id
KUTOKA kwenye Folda f JIUNGE @tmp t ON f.parent=t.Folder_ID
AMBAPO F.id HAKUNA(CHAGUA Folda_ID KUTOKA @tmp)
WEKA @Cnt = @@ROWCOUNT
MWISHO
WEKA NDANI YA @Files(Jina, Tarehe_Create, FileSize)
CHAGUA F.Name, F.Date_Create, F.FileSize
KUTOKA kwa Faili f JIUNGE NA Folda Fl kwenye f.Folder_id = Fl.id
JIUNGE na @tmp t kwenye Fl.id = t.Folder_Id
RUDISHA
MWISHO

Hapa, kwa kitanzi, saraka ndogo zote katika viwango vyote vya kuota huongezwa kwa utofauti wa @tmp hadi kusiwe na saraka ndogo zaidi zilizobaki. Tofauti ya matokeo ya @Files kisha hurekodi sifa zote muhimu za faili zilizo kwenye saraka zilizoorodheshwa katika utofauti wa @tmp.

Kazi za kazi ya kujitegemea

Lazima uunde na utatue taratibu tano zilizohifadhiwa kutoka kwa orodha ifuatayo inayohitajika:

Utaratibu wa 1. Kuongeza tarehe ya mwisho ya kuwasilisha nakala za kitabu kwa wiki ikiwa tarehe ya sasa ya kukamilisha iko ndani ya masafa kutoka siku tatu kabla ya tarehe ya sasa hadi siku tatu baada ya tarehe ya sasa.

Utaratibu wa 2. Kuhesabu idadi ya nakala za bure za kitabu fulani.

Utaratibu wa 3. Kuangalia uwepo wa msomaji aliyepewa jina la mwisho na tarehe ya kuzaliwa.

Utaratibu wa 4. Kuingiza msomaji mpya, kuangalia kuwepo kwake katika hifadhidata na kuamua nambari yake mpya ya kadi ya maktaba.

Utaratibu wa 5. Uhesabuji wa faini kwa masharti ya fedha kwa wasomaji wa deni.

Maelezo mafupi ya taratibu

Utaratibu 1. Kuongeza muda wa mwisho wa utoaji wa vitabu

Kwa kila rekodi katika jedwali la Mfano, inaangaliwa kama tarehe ya kukamilisha ya kitabu iko ndani ya muda uliobainishwa. Ikiwezekana, tarehe ya kurudi kwa kitabu huongezwa kwa wiki. Wakati wa kufanya utaratibu, lazima utumie kazi ya kufanya kazi na tarehe:

TareheOngeza (siku,<число добавляемых дней>, <начальная дата>)

Utaratibu wa 2. Kuhesabu idadi ya nakala za bure za kitabu fulani

Kigezo cha uingizaji wa utaratibu ni ISBN cipher ya kipekee ya kitabu. Utaratibu unarudisha 0 (sifuri) ikiwa nakala zote za kitabu hiki ziko mikononi mwa wasomaji. Utaratibu hurejesha thamani N, sawa na idadi ya nakala za kitabu ambazo kwa sasa ziko mikononi mwa wasomaji.

Ikiwa kitabu kilicho na ISBN iliyotolewa haipo kwenye maktaba, basi utaratibu unarudi 100 (minus mia moja).

Utaratibu wa 3. Kuangalia uwepo wa msomaji aliyepewa jina la mwisho na tarehe ya kuzaliwa

Utaratibu hurejesha nambari ya kadi ya maktaba ikiwa msomaji aliye na data kama hiyo yupo, na 0 (sifuri) vinginevyo.

Unapolinganisha tarehe ya kuzaliwa, ni lazima utumie Convert() kitendakazi cha ubadilishaji kubadilisha tarehe ya kuzaliwa, kigezo cha Varchar(8) kinachotumika kama kigezo cha ingizo kwa utaratibu, kuwa muda wa data, unaotumika kwenye jedwali la Visomaji. Vinginevyo, operesheni ya kulinganisha wakati wa kutafuta msomaji aliyepewa haitafanya kazi.

Utaratibu wa 4: Kuingiza Kisomaji Kipya

Utaratibu una pembejeo tano na vigezo vitatu vya pato.

Vigezo vya kuingiza:

  • Jina kamili na herufi za mwanzo;
  • Anwani;
  • Tarehe ya kuzaliwa;
  • Simu ya nyumbani;
  • Simu inafanya kazi.

Vigezo vya pato:

  • Nambari ya kadi ya maktaba;
  • Dalili ya ikiwa msomaji alisajiliwa hapo awali kwenye maktaba (0 hakuwa, 1 alikuwa);
  • Idadi ya vitabu ambavyo msomaji anamiliki.
Utaratibu wa 5. Uhesabuji wa faini kwa masharti ya fedha kwa wasomaji wa deni

Utaratibu hufanya kazi na mshale ambao una orodha ya nambari za kadi za maktaba za wadaiwa wote. Wakati wa mchakato wa kazi, jedwali la muda la kimataifa ##DOLG linapaswa kuundwa, ambalo kwa kila mdaiwa deni lake la jumla kwa masharti ya fedha kwa vitabu vyote alivyokuwa navyo kwa muda mrefu zaidi ya kipindi cha kurejesha kitaingizwa. Fidia ya pesa taslimu inakokotolewa kwa 0.5% ya bei kwa kila kitabu kwa siku ya kuchelewa.

Utaratibu wa kazi

  • nakala za skrini (viwambo vya skrini) kuthibitisha mabadiliko yaliyofanywa kwenye hifadhidata;
  • yaliyomo kwenye majedwali ya hifadhidata ambayo yanahitajika ili kuthibitisha utendakazi sahihi;
  • maandishi ya utaratibu uliohifadhiwa na maoni;
  • mchakato wa kuendesha utaratibu uliohifadhiwa na kutoa matokeo ya kazi.

Kazi za ziada

Taratibu zifuatazo za ziada zilizohifadhiwa ni za kazi za kibinafsi.

Utaratibu wa 6. Kuhesabu idadi ya vitabu kwenye eneo fulani la somo ambavyo vinapatikana sasa maktabani katika angalau nakala moja. Eneo la mada hupitishwa kama kigezo cha kuingiza.

Utaratibu wa 7. Kuingiza kitabu kipya kinachoonyesha idadi ya nakala. Unapoingiza nakala za kitabu kipya, hakikisha kuwa umeweka nambari zao sahihi za kujiunga. Fikiria jinsi unavyoweza kufanya hivi. Kama ukumbusho, una chaguo za kukokotoa za Max na Min, ambazo hukuruhusu kupata thamani ya juu zaidi au ya chini kabisa ya sifa yoyote ya nambari kwa kutumia hoja ya Chagua.

Utaratibu wa 8. Uundaji wa meza yenye orodha ya wasomaji wa deni, yaani, wale ambao walipaswa kurudisha vitabu kwenye maktaba, lakini bado hawajazirudisha. Katika meza inayosababisha, kila msomaji wa deni anapaswa kuonekana mara moja tu, bila kujali ni vitabu ngapi anadaiwa. Kwa kuongeza jina lako kamili na nambari ya kadi ya maktaba, lazima uonyeshe anwani yako na nambari ya simu kwenye jedwali linalofuata.

Utaratibu wa 9. Tafuta nakala bila malipo ukitumia jina la kitabu ulichopewa. Ikiwa kuna nakala ya bure, utaratibu unarudi nambari ya hesabu ya nakala; ikiwa sio, basi utaratibu unarudi orodha ya wasomaji ambao wana kitabu hiki, kuonyesha tarehe ya kurudi kwa kitabu na nambari ya simu ya msomaji.

Utaratibu wa 10. Kuonyesha orodha ya wasomaji ambao kwa sasa hawana vitabu vyovyote mikononi mwao. Tafadhali onyesha jina lako na nambari ya simu kwenye orodha.

Utaratibu wa 11. Kuonyesha orodha ya vitabu inayoonyesha idadi ya nakala za kitabu fulani kwenye maktaba na idadi ya nakala za bure kwa sasa.

toleo la kuchapisha

Taratibu zilizohifadhiwa za SQL ni moduli za programu zinazoweza kutekelezwa ambazo zinaweza kuhifadhiwa kwa namna ya vitu mbalimbali. Kwa maneno mengine, ni kitu ambacho kina taarifa za SQL. Taratibu hizi zilizohifadhiwa zinaweza kutekelezwa katika mteja wa programu ili kupata utendaji mzuri. Kwa kuongeza, vitu vile mara nyingi huitwa kutoka kwa maandiko mengine au hata kutoka kwa sehemu nyingine.

Utangulizi

Watu wengi wanaamini kuwa wao ni sawa na taratibu mbalimbali (kwa mtiririko huo, isipokuwa MS SQL). Labda hii ni kweli. Wana vigezo sawa na wanaweza kuzalisha maadili sawa. Aidha, katika baadhi ya matukio wanagusa. Kwa mfano, zimeunganishwa na hifadhidata za DDL na DML, pamoja na kazi za mtumiaji (codenamed UDF).

Kwa kweli, taratibu zilizohifadhiwa za SQL zina faida nyingi ambazo huwatenganisha na michakato inayofanana. Usalama, kubadilika kwa programu, tija - yote haya huvutia watumiaji zaidi na zaidi wanaofanya kazi na hifadhidata. Umaarufu wa kilele wa taratibu ulitokea mwaka 2005-2010, wakati programu kutoka kwa Microsoft inayoitwa "SQL Server Management Studio" ilitolewa. Kwa msaada wake, kufanya kazi na hifadhidata imekuwa rahisi zaidi, zaidi ya vitendo na rahisi. Kuanzia mwaka hadi mwaka, huyu alipata umaarufu kati ya watengeneza programu. Leo ni programu inayojulikana kabisa, ambayo kwa watumiaji ambao "wanawasiliana" na hifadhidata ni sawa na Excel.

Utaratibu unapoitwa, huchakatwa mara moja na seva yenyewe bila michakato isiyo ya lazima au uingiliaji wa mtumiaji. Baada ya hayo, unaweza kutekeleza kufuta, kutekeleza, au kurekebisha. Opereta wa DDL anajibika kwa haya yote, ambaye peke yake hufanya vitendo ngumu zaidi kusindika vitu. Kwa kuongezea, haya yote hufanyika haraka sana, na seva haijapakiwa. Kasi na utendaji huu hukuruhusu kuhamisha haraka kiasi kikubwa cha habari kutoka kwa mtumiaji hadi kwa seva na kinyume chake.

Ili kutekeleza teknolojia hii ya kufanya kazi na habari, kuna lugha kadhaa za programu. Hizi ni pamoja na, kwa mfano, PL/SQL kutoka Oracle, PSQL katika mifumo ya InterBase na Firebird, pamoja na Microsoft Transact-SQL ya kawaida. Zote zimeundwa kwa ajili ya kuunda na kutekeleza taratibu zilizohifadhiwa, ambayo inaruhusu wasindikaji wa database kubwa kutumia algorithms yao wenyewe. Hii pia ni muhimu ili wale wanaosimamia habari hizo waweze kulinda vitu vyote kutoka kwa upatikanaji usioidhinishwa na wahusika wa tatu na, ipasavyo, uundaji, urekebishaji au ufutaji wa data fulani.

Tija

Vipengee hivi vya hifadhidata vinaweza kupangwa kwa njia mbalimbali. Hii inaruhusu watumiaji kuchagua aina ya njia inayotumika ambayo inafaa zaidi, kuokoa juhudi na wakati. Kwa kuongeza, utaratibu unashughulikiwa yenyewe, ambayo huepuka wakati mkubwa unaotumiwa kwenye mawasiliano kati ya seva na mtumiaji. Pia, moduli inaweza kupangwa upya na kubadilishwa katika mwelekeo unaotaka wakati wowote kabisa. Inastahili kuzingatia kasi ambayo utaratibu wa kuhifadhiwa wa SQL unazinduliwa: mchakato huu hutokea kwa kasi zaidi kuliko wengine sawa na hiyo, ambayo inafanya kuwa rahisi na ya ulimwengu wote.

Usalama

Aina hii ya usindikaji wa habari inatofautiana na michakato sawa kwa kuwa inahakikisha usalama ulioongezeka. Hii inahakikishwa na ukweli kwamba upatikanaji wa taratibu na watumiaji wengine unaweza kutengwa kabisa. Hii itamruhusu msimamizi kufanya shughuli nao kwa kujitegemea, bila hofu ya kuingilia habari au ufikiaji usioidhinishwa wa hifadhidata.

Uhamisho wa data

Uhusiano kati ya utaratibu uliohifadhiwa wa SQL na programu ya mteja ni matumizi ya vigezo na maadili ya kurejesha. Mwisho sio lazima kupitisha data kwa utaratibu uliohifadhiwa, lakini habari hii (hasa kwa ombi la mtumiaji) inashughulikiwa kwa SQL. Baada ya utaratibu uliohifadhiwa kukamilisha kazi yake, hutuma pakiti za data nyuma (lakini tena kwa hiari) kwa programu iliyoiita, kwa kutumia mbinu mbalimbali ambazo zinaweza kutumika kupiga utaratibu uliohifadhiwa wa SQL au kurejesha, kwa mfano:

Kuhamisha data kwa kutumia parameter ya aina ya Pato;

Kupitisha data kwa kutumia operator wa kurudi;

Kupitisha data kwa kutumia opereta iliyochaguliwa.

Sasa hebu tuone jinsi mchakato huu unavyoonekana kutoka ndani.

1. Unda utaratibu uliohifadhiwa wa EXEC katika SQL

Unaweza kuunda utaratibu katika MS SQL (Studio ya Usimamizi). Baada ya utaratibu kuundwa, itaorodheshwa katika node inayoweza kupangwa ya database, ambayo utaratibu wa uumbaji unafanywa na operator. Ili kutekeleza, taratibu zilizohifadhiwa za SQL hutumia mchakato wa EXEC ambao una jina la kitu chenyewe.

Unapounda utaratibu, jina lake linaonekana kwanza, ikifuatiwa na vigezo moja au zaidi vilivyopewa. Vigezo vinaweza kuwa vya hiari. Baada ya parameter (s), yaani, mwili wa utaratibu, umeandikwa, baadhi ya shughuli muhimu zinahitajika kufanywa.

Jambo ni kwamba mwili unaweza kuwa na vigezo vya ndani vilivyomo ndani yake, na vigezo hivi pia ni vya ndani kuhusiana na taratibu. Kwa maneno mengine, zinaweza tu kutazamwa ndani ya mwili wa utaratibu wa Seva ya Microsoft SQL. Taratibu zilizohifadhiwa katika kesi hii zinachukuliwa kuwa za ndani.

Kwa hivyo, ili kuunda utaratibu, tunahitaji jina la utaratibu na angalau parameter moja kama mwili wa utaratibu. Kumbuka kuwa chaguo kubwa katika kesi hii ni kuunda na kutekeleza utaratibu na jina la schema kwenye kiainishaji.

Mwili wa utaratibu unaweza kuwa wa aina yoyote, kama vile kuunda meza, kuingiza safu moja au zaidi ya meza, kuanzisha aina na asili ya hifadhidata, na kadhalika. Walakini, mwili wa utaratibu huzuia shughuli fulani kufanywa ndani yake. Baadhi ya vikwazo muhimu vimeorodheshwa hapa chini:

Mwili haupaswi kuunda utaratibu mwingine wowote uliohifadhiwa;

Mwili haupaswi kuunda hisia ya uwongo ya kitu;

Mwili haupaswi kuunda vichochezi vyovyote.

2. Kuweka kutofautiana katika mwili wa utaratibu

Unaweza kufanya vigezo vya ndani kwa mwili wa utaratibu, na kisha watakaa ndani ya mwili wa utaratibu. Ni mazoezi mazuri ya kuunda vigezo mwanzoni mwa mwili wa utaratibu uliohifadhiwa. Lakini pia unaweza kuweka vijiwezo mahali popote kwenye mwili wa kitu fulani.

Wakati mwingine unaweza kuona kwamba vigezo kadhaa vimewekwa kwenye mstari mmoja, na kila parameter ya kutofautiana hutenganishwa na comma. Pia kumbuka kuwa kutofautisha kumewekwa awali na @. Katika mwili wa utaratibu unaweza kuweka kutofautisha popote unapotaka. Kwa mfano, kigezo cha @NAME1 kinaweza kutangazwa karibu na mwisho wa chombo cha utaratibu. Ili kugawa thamani kwa tofauti iliyotangazwa, seti ya data ya kibinafsi hutumiwa. Tofauti na hali ambapo kutofautiana zaidi ya moja kunatangazwa kwenye mstari huo, katika hali hii seti moja tu ya data ya kibinafsi hutumiwa.

Watumiaji mara nyingi huuliza swali: "Jinsi ya kugawa maadili mengi katika taarifa moja kwenye mwili wa utaratibu?" Vizuri. Ni swali la kuvutia, lakini ni rahisi kufanya kuliko unavyofikiri. Jibu: Kwa kutumia jozi kama vile "Chagua Var = thamani". Unaweza kutumia jozi hizi kwa kuzitenganisha kwa koma.

Mifano mbalimbali zinaonyesha watu wanaunda utaratibu rahisi uliohifadhiwa na kuutekeleza. Walakini, utaratibu unaweza kukubali vigezo ili mchakato wa kuiita utakuwa na maadili karibu nayo (lakini sio kila wakati). Ikiwa zinapatana, basi michakato inayolingana huanza ndani ya mwili. Kwa mfano, ikiwa utaunda utaratibu ambao utakubali jiji na eneo kutoka kwa mpigaji simu na kurudisha data kuhusu waandishi wangapi ni wa jiji na eneo linalolingana. Utaratibu utauliza jedwali la waandishi wa hifadhidata, kama vile Pubs, ili kutekeleza hesabu hii ya waandishi. Ili kupata hifadhidata hizi, kwa mfano, Google hupakua hati ya SQL kutoka kwa ukurasa wa SQL2005.

Katika mfano uliopita, utaratibu unachukua vigezo viwili, ambavyo kwa Kiingereza kitaitwa kwa kawaida @State na @City. Aina ya data inalingana na aina iliyofafanuliwa kwenye programu. Mwili wa utaratibu una vigezo vya ndani @TotalAuthors, na utofauti huu hutumika kuonyesha idadi ya waandishi. Inayofuata inakuja sehemu ya uteuzi wa hoja, ambayo huhesabu kila kitu. Hatimaye, thamani iliyohesabiwa inachapishwa kwenye dirisha la pato kwa kutumia taarifa ya kuchapisha.

Jinsi ya kutekeleza utaratibu uliohifadhiwa katika SQL

Kuna njia mbili za kufanya utaratibu. Njia ya kwanza inaonyesha, kwa kupitisha vigezo, jinsi orodha iliyotenganishwa kwa koma inatekelezwa baada ya jina la utaratibu. Wacha tuseme tuna maadili mawili (kama katika mfano uliopita). Thamani hizi hukusanywa kwa kutumia vigezo vya vigezo vya @State na @City. Katika njia hii ya kupitisha vigezo, utaratibu ni muhimu. Njia hii inaitwa kupitisha hoja ya kawaida. Kwa njia ya pili, vigezo tayari vimepewa moja kwa moja, na katika kesi hii utaratibu sio muhimu. Njia hii ya pili inajulikana kama kupitisha hoja zilizopewa jina.

Utaratibu unaweza kutofautiana kidogo kutoka kwa kawaida. Kila kitu ni sawa na katika mfano uliopita, lakini hapa tu vigezo vinabadilishwa. Hiyo ni, @City inahifadhiwa kwanza, na @State inahifadhiwa karibu na dhamana chaguo-msingi. Kigezo chaguo-msingi kawaida huangaziwa kando. Taratibu zilizohifadhiwa za SQL hupitishwa kama vigezo tu. Katika kesi hii, zinazotolewa, parameter "UT" inachukua nafasi ya thamani ya default "CA". Katika utekelezaji wa pili, thamani moja tu ya hoja hupitishwa kwa kigezo cha @City, na kigezo cha @State kinachukua dhamana ya chaguo-msingi ya "CA". Watengenezaji programu wenye uzoefu wanashauri kwamba vigezo vyote vinapaswa kupatikana hadi mwisho wa orodha ya vigezo kwa chaguo-msingi. Vinginevyo utekelezaji hauwezekani, halafu itabidi ufanye kazi na kupitisha hoja zilizotajwa, ambazo ni ndefu na ngumu zaidi.

4. Taratibu Zilizohifadhiwa za Seva ya SQL: Mbinu za Kurudisha

Kuna njia tatu muhimu za kutuma data kwa utaratibu unaoitwa kuhifadhiwa. Zimeorodheshwa hapa chini:

Rudisha thamani ya utaratibu uliohifadhiwa;

Utaratibu uliohifadhiwa pato la parameter;

Kuchagua moja ya taratibu zilizohifadhiwa.

4.1 Kurudisha thamani kutoka kwa taratibu zilizohifadhiwa za SQL

Katika mbinu hii, utaratibu unapeana thamani kwa utofauti wa ndani na kuirejesha. Utaratibu unaweza pia kurudisha thamani moja kwa moja. Katika mfano ufuatao, tuliunda utaratibu ambao unarudisha jumla ya idadi ya waandishi. Ikiwa unalinganisha utaratibu huu na uliopita, unaweza kuona kwamba thamani ya kuchapisha imebadilishwa.

Sasa hebu tuone jinsi ya kutekeleza utaratibu na kuchapisha thamani yake ya kurudi. Utekelezaji wa utaratibu unahitaji kuweka kutofautiana na uchapishaji, ambao unafanywa baada ya mchakato huu wote. Kumbuka kuwa badala ya taarifa ya kuchapisha, unaweza kutumia kauli ya Chagua, kama vile Chagua @RetValue pamoja na OutputValue.

4.2 Pato la Kigezo cha Utaratibu uliohifadhiwa wa SQL

Thamani ya majibu inaweza kutumika kurudisha kigezo kimoja, ambacho ndicho tulichoona katika mfano uliopita. Kutumia kigezo cha Pato huruhusu utaratibu wa kutuma thamani moja au zaidi tofauti kwa mpigaji simu. Parameta ya pato imeteuliwa kwa usahihi na neno hili muhimu "Pato" wakati wa kuunda utaratibu. Ikiwa parameta imepewa kama pato la pato, basi kitu cha utaratibu lazima kipe thamani yake. Taratibu zilizohifadhiwa za SQL, mifano ambayo inaweza kuonekana hapa chini, katika kesi hii kurudi na maelezo ya muhtasari.

Katika mfano wetu kutakuwa na majina mawili ya pato: @TotalAuthors na @TotalNoContract. Zinaonyeshwa kwenye orodha ya vigezo. Vigezo hivi vinapeana maadili ndani ya mwili wa utaratibu. Tunapotumia vigezo vya pato, mpigaji simu anaweza kuona thamani iliyowekwa ndani ya mwili wa utaratibu.

Pia, katika hali ya awali, vigeu viwili vinatangazwa ili kuona thamani ambazo Seva ya MS SQL ilihifadhi taratibu zilizowekwa katika kigezo cha kutoa. Kisha utaratibu unafanywa kwa kusambaza thamani ya kawaida ya parameter "CA". Vigezo vifuatavyo ni vigezo vya pato na hivyo vigezo vilivyotangazwa vinapitishwa kwa utaratibu maalum. Kumbuka kwamba wakati wa kupitisha vigezo, neno kuu la pato pia limewekwa hapa. Baada ya utaratibu kukamilika kwa mafanikio, maadili yaliyorejeshwa na vigezo vya pato huonyeshwa kwenye sanduku la ujumbe.

4.3 Kuchagua mojawapo ya taratibu zilizohifadhiwa za SQL

Mbinu hii inatumika kurudisha seti ya thamani kama jedwali la data (RecordSet) kwa utaratibu uliohifadhiwa wa kupiga simu. Katika mfano huu, utaratibu uliohifadhiwa wa SQL na vigezo vya @AuthID huuliza jedwali la Waandishi kwa kuchuja rekodi zilizorejeshwa kwa kutumia parameta hiyo ya @AuthId. Taarifa ya Chagua huamua ni nini kinafaa kurejeshwa kwa mpigaji simu wa utaratibu uliohifadhiwa. Wakati utaratibu uliohifadhiwa unatekelezwa, AuthId inarudishwa. Utaratibu huu hapa daima hurejesha rekodi moja tu au hakuna kabisa. Lakini utaratibu uliohifadhiwa hauna vikwazo vyovyote vya kurudisha rekodi zaidi ya moja. Sio kawaida kuona mifano ambapo data inarejeshwa kwa kutumia vigezo vilivyochaguliwa vinavyohusisha vigeu vilivyokokotwa kwa kutoa jumla nyingi.

Hatimaye

Utaratibu uliohifadhiwa ni moduli kubwa ya mpango ambayo inarudi au kupita, na pia huweka vigezo muhimu kwa shukrani kwa programu ya mteja. Kwa sababu utaratibu uliohifadhiwa hujiendesha kwenye seva, kiasi kikubwa cha kubadilishana data kati ya seva na programu ya mteja (kwa baadhi ya mahesabu) inaweza kuepukwa. Hii inakuwezesha kupunguza mzigo kwenye seva za SQL, ambazo, bila shaka, hufaidika wamiliki wao. Moja ya aina ndogo ni taratibu zilizohifadhiwa za T SQL, lakini utafiti wao ni muhimu kwa wale wanaounda hifadhidata za kuvutia. Pia kuna idadi kubwa, hata kubwa ya nuances ambayo inaweza kuwa muhimu wakati wa kusoma taratibu zilizohifadhiwa, lakini hii inahitajika zaidi kwa wale wanaopanga kushiriki katika programu, ikiwa ni pamoja na kitaaluma.

Utaratibu uliohifadhiwa ni aina maalum ya kifurushi cha taarifa ya Transact-SQL iliyoundwa kwa kutumia lugha ya SQL na viendelezi vya kiutaratibu. Tofauti kuu kati ya kifurushi na utaratibu uliohifadhiwa ni kwamba mwisho huhifadhiwa kama kitu cha hifadhidata. Kwa maneno mengine, taratibu zilizohifadhiwa zimehifadhiwa kwenye upande wa seva ili kuboresha utendaji na uthabiti wa kazi zinazoweza kurudiwa.

Injini ya Hifadhidata inasaidia taratibu zilizohifadhiwa na taratibu za mfumo. Taratibu zilizohifadhiwa zinaundwa kwa njia sawa na vitu vingine vyote vya database, i.e. kwa kutumia lugha ya DDL. Taratibu za mfumo hutolewa na Injini ya Hifadhidata na inaweza kutumika kupata na kurekebisha habari katika katalogi ya mfumo.

Unapounda utaratibu uliohifadhiwa, unaweza kufafanua orodha ya hiari ya vigezo. Kwa njia hii, utaratibu utakubali hoja zinazofaa kila wakati unapoitwa. Taratibu zilizohifadhiwa zinaweza kurudisha thamani iliyo na maelezo yaliyofafanuliwa na mtumiaji au, ikitokea hitilafu, ujumbe unaofaa wa hitilafu.

Utaratibu uliohifadhiwa hukusanywa kabla ya kuhifadhiwa kama kitu kwenye hifadhidata. Fomu iliyokusanywa mapema ya utaratibu huhifadhiwa kwenye hifadhidata na hutumiwa kila wakati inapoitwa. Sifa hii ya taratibu zilizohifadhiwa hutoa faida muhimu ya kuondoa (karibu katika hali zote) makusanyo ya utaratibu unaorudiwa na kufikia uboreshaji wa utendaji unaolingana. Mali hii ya taratibu zilizohifadhiwa pia ina athari nzuri kwa kiasi cha data iliyobadilishwa kati ya mfumo wa database na maombi. Hasa, kupiga utaratibu uliohifadhiwa ambao ni ka elfu kadhaa kwa ukubwa unaweza kuhitaji chini ya ka 50. Watumiaji wengi wanapofanya kazi zinazojirudia kwa kutumia taratibu zilizohifadhiwa, athari limbikizi ya akiba hizi inaweza kuwa muhimu sana.

Taratibu zilizohifadhiwa pia zinaweza kutumika kwa madhumuni yafuatayo:

    kuunda logi ya vitendo na meza za hifadhidata.

Kutumia taratibu zilizohifadhiwa hutoa kiwango cha udhibiti wa usalama ambacho huenda zaidi ya usalama unaotolewa kwa kutumia taarifa za GRANT na BATILISHA, ambazo huwapa watumiaji haki tofauti za ufikiaji. Hili linawezekana kwa sababu uidhinishaji wa kutekeleza utaratibu uliohifadhiwa hautegemei idhini ya kurekebisha vitu vilivyomo katika utaratibu uliohifadhiwa, kama ilivyoelezwa katika sehemu inayofuata.

Taratibu zilizohifadhiwa ambazo huunda kumbukumbu za uandishi wa jedwali na/au shughuli za kusoma hutoa chaguo la ziada kwa usalama wa hifadhidata. Kwa kutumia taratibu kama hizi, msimamizi wa hifadhidata anaweza kufuatilia marekebisho yaliyofanywa kwenye hifadhidata na watumiaji au programu za programu.

Kuunda na Kutekeleza Taratibu Zilizohifadhiwa

Taratibu zilizohifadhiwa zinaundwa kwa kutumia taarifa TENGENEZA UTARATIBU, ambayo ina syntax ifuatayo:

TUNDA PROC proc_name [((@param1) type1 [ VARYING] [= default1] )] (, ...) AS bechi | EXTERNAL NAME method_name Kanuni za Sintaksia

Kigezo cha schema_name kinabainisha jina la schema ambalo limepewa na mmiliki wa utaratibu uliohifadhiwa ulioundwa. Kigezo cha proc_name kinabainisha jina la utaratibu uliohifadhiwa. Kigezo cha @param1 ni kigezo cha utaratibu (hoja rasmi) ambayo aina yake ya data imedhamiriwa na kigezo cha type1. Vigezo vya utaratibu ni vya kawaida ndani ya utaratibu, kama vile anuwai za kawaida ziko ndani ya kifurushi. Vigezo vya utaratibu ni maadili ambayo hupitishwa na mpigaji kwa utaratibu wa matumizi ndani yake. Kigezo chaguo-msingi 1 kinabainisha thamani chaguo-msingi ya kigezo cha utaratibu unaolingana. (Thamani chaguo-msingi pia inaweza kuwa NULL.)

Chaguo la OUTPUT inaonyesha kuwa kigezo cha utaratibu ni kigezo cha kurejesha na kinaweza kutumika kurejesha thamani kutoka kwa utaratibu uliohifadhiwa hadi kwa utaratibu wa kupiga simu au mfumo.

Kama ilivyoelezwa hapo awali, fomu iliyokusanywa ya utaratibu huhifadhiwa kwenye hifadhidata na hutumiwa kila wakati inapoitwa. Ikiwa kwa sababu fulani utaratibu uliohifadhiwa unahitaji kukusanywa kila wakati unapoitwa, wakati wa kutangaza utaratibu, tumia NA chaguo la RECOMPILE. Kutumia chaguo la WITH RECOMPILE kunakanusha mojawapo ya manufaa muhimu zaidi ya taratibu zilizohifadhiwa: uboreshaji wa utendaji kutokana na mkusanyiko mmoja. Kwa hivyo, chaguo la WITH RECOMPILE linapaswa kutumika tu wakati vitu vya hifadhidata vinavyotumiwa na utaratibu uliohifadhiwa vinarekebishwa mara kwa mara.

TEKELEZA KAMA kifungu inafafanua muktadha wa usalama ambao utaratibu uliohifadhiwa unapaswa kutekelezwa baada ya kuitwa. Kwa kuweka muktadha huu, Injini ya Hifadhidata inaweza kudhibiti uteuzi wa akaunti za watumiaji ili kuthibitisha ruhusa za ufikiaji wa vitu vinavyorejelewa na utaratibu uliohifadhiwa.

Kwa chaguomsingi, ni wanachama pekee wa jukumu la seva isiyobadilika na db_owner au db_ddladmin majukumu yasiyobadilika ya hifadhidata wanaweza kutumia taarifa ya CREATE PROCEDURE. Lakini washiriki wa majukumu haya wanaweza kutoa haki hii kwa watumiaji wengine kwa kutumia taarifa RUZUKU TUNZA UTARATIBU.

Mfano hapa chini unaonyesha jinsi ya kuunda utaratibu rahisi uliohifadhiwa kufanya kazi na jedwali la Mradi:

TUMIA SampuliDb; NENDA UUNDE UTARATIBU WA Ongezeko la Bajeti (@percent INT=5) HUKU USASISHAJI WA Mradi SET Bajeti = Bajeti + Bajeti * @percent/100;

Kama ilivyoelezwa hapo awali, kutenganisha pakiti mbili, tumia maelekezo GO. Taarifa ya CREATE PROCEDURE haiwezi kuunganishwa na taarifa zingine za Transact-SQL katika kundi moja. Utaratibu uliohifadhiwa wa Ongezeko la Bajeti huongeza bajeti za miradi yote kwa asilimia fulani, ikibainishwa na kigezo cha @percent. Utaratibu pia unafafanua thamani ya asilimia chaguo-msingi (5) ambayo inatumika ikiwa hoja hii haipo wakati utaratibu unaendelea.

Taratibu zilizohifadhiwa zinaweza kufikia meza ambazo hazipo. Kipengele hiki hukuruhusu kutatua msimbo wa utaratibu bila kwanza kuunda jedwali zinazofaa au hata kuunganisha kwenye seva lengwa.

Tofauti na taratibu za msingi zilizohifadhiwa, ambazo huhifadhiwa kila wakati kwenye hifadhidata ya sasa, inawezekana kuunda taratibu zilizohifadhiwa za muda ambazo huhifadhiwa kila wakati kwenye hifadhidata ya mfumo wa muda tempdb. Sababu moja ya kuunda taratibu zilizohifadhiwa kwa muda inaweza kuwa kuepuka kutekeleza mara kwa mara kikundi maalum cha taarifa wakati wa kuunganisha kwenye hifadhidata. Unaweza kuunda taratibu za muda za ndani au kimataifa. Ili kufanya hivyo, jina la utaratibu wa ndani linatajwa na herufi moja # (#proc_name), na jina la utaratibu wa kimataifa linatajwa na herufi mbili (##proc_name).

Utaratibu wa ndani uliohifadhiwa wa muda unaweza tu kutekelezwa na mtumiaji aliyeuunda, na tu wakati umeunganishwa kwenye hifadhidata ambayo iliundwa. Utaratibu wa muda wa kimataifa unaweza kutekelezwa na watumiaji wote, lakini tu hadi uunganisho wa mwisho ambao unatekelezwa (kawaida uunganisho wa muundaji wa utaratibu) utakoma.

Mzunguko wa maisha ya utaratibu uliohifadhiwa una hatua mbili: uumbaji wake na utekelezaji wake. Kila utaratibu huundwa mara moja na kutekelezwa mara nyingi. Utaratibu uliohifadhiwa unafanywa kwa kutumia TIMIZA maagizo mtumiaji ambaye ni mmiliki wa utaratibu au ana haki ya KUTEKELEZA kufikia utaratibu huo. Taarifa ya EXECUTE ina syntax ifuatayo:

[] [@return_status =] (proc_name | @proc_name_var) ([[@parameter1 =] thamani | [@parameter1=] @variable ] | DEFAULT).. Mikataba ya sintaksia

Isipokuwa kigezo cha return_status, vigezo vyote vya taarifa ya EXECUTE vina maana ya kimantiki sawa na vigezo sawa vya taarifa ya CREATE PROCEDURE. Kigezo cha return_status kinabainisha kigezo kamili ambacho huhifadhi hali ya kurudi kwa utaratibu. Thamani inaweza kugawiwa kwa kigezo kwa kutumia kigezo kisichobadilika (thamani) au kigezo cha ndani (@variable). Mpangilio wa maadili ya vigezo vilivyotajwa sio muhimu, lakini maadili ya vigezo visivyo na jina lazima yatolewe kwa utaratibu ambao yamefafanuliwa katika taarifa ya CREATE PROCEDURE.

Ibara ya DEFAULT hutoa thamani chaguo-msingi kwa kigezo cha utaratibu ambacho kilibainishwa katika ufafanuzi wa utaratibu. Wakati utaratibu unatarajia thamani ya kigezo ambacho hakuna thamani chaguo-msingi imefafanuliwa na kigezo kinakosekana au neno kuu la DEFAULT limebainishwa, hitilafu hutokea.

Wakati taarifa ya TEKELEZA ni taarifa ya kwanza ya kundi, neno kuu la EXECUTE linaweza kuachwa. Hata hivyo, ni salama zaidi kujumuisha neno hili katika kila pakiti. Matumizi ya taarifa ya EXECUTE yanaonyeshwa katika mfano hapa chini:

TUMIA SampuliDb; TIMIZA Ongezeko la Bajeti 10;

Taarifa ya EXECUTE katika mfano huu inatekeleza utaratibu uliohifadhiwa wa IncreaseBudget, ambao huongeza bajeti ya miradi yote kwa 10%.

Mfano hapa chini unaonyesha jinsi ya kuunda utaratibu uliohifadhiwa wa kuchakata data katika Jedwali la Mfanyakazi na Kazi_kwenye:

Utaratibu wa mfano wa ModifyEmpId unaonyesha matumizi ya taratibu zilizohifadhiwa kama sehemu ya mchakato wa kudumisha uadilifu wa marejeleo (katika kesi hii kati ya Jedwali la Mfanyakazi na Works_on). Utaratibu sawa uliohifadhiwa unaweza kutumika ndani ya ufafanuzi wa kichochezi, ambao hutoa uadilifu wa marejeleo.

Mfano ufuatao unaonyesha matumizi ya kifungu cha OUTPUT katika utaratibu uliohifadhiwa:

Utaratibu huu uliohifadhiwa unaweza kutekelezwa kwa kutumia maagizo yafuatayo:

TANGAZA @quantityDeleteMfanyakazi INT; TEKELEZA Futa Mfanyakazi @empId=18316, @OUTPUT; PRINT N"Wafanyakazi waliofutwa: " + convert(nvarchar(30), @quantityDeleteEmployee);

Utaratibu huu huhesabu idadi ya miradi ambayo mfanyakazi aliye na nambari ya wafanyikazi @empId anaifanyia kazi na kukabidhi thamani inayotokana na ©counter parameta. Baada ya safu mlalo zote za nambari fulani ya wafanyikazi kufutwa kutoka kwa Jedwali la Mfanyakazi na Kazi_kwenye, thamani iliyohesabiwa inapewa kigezo cha @quantityDeleteMfanyakazi.

Thamani ya parameta inarejeshwa kwa utaratibu wa kupiga simu tu ikiwa chaguo la OUTPUT limebainishwa. Katika mfano hapo juu, utaratibu wa DeleteEmployee hupitisha parameter ya @counter kwa utaratibu wa kupiga simu, kwa hiyo utaratibu uliohifadhiwa unarudi thamani kwenye mfumo. Kwa hivyo, kigezo cha @counter lazima kibainishwe katika chaguo la OUTPUT wakati wa kutangaza utaratibu na katika taarifa ya EXECUTE wakati wa kuiita.

NA MATOKEO SETS kifungu cha taarifa ya TEKELEZA

Katika SQL Server 2012, kwa taarifa ya EXECUTE, unaingia NA MATOKEO SETS kifungu, kwa njia ambayo, wakati hali fulani zinakabiliwa, unaweza kubadilisha fomu ya seti ya matokeo ya utaratibu uliohifadhiwa.

Mifano miwili ifuatayo itasaidia kufafanua sentensi hii. Mfano wa kwanza ni mfano wa utangulizi unaoonyesha jinsi matokeo yanavyoweza kuonekana wakati kifungu cha WITH RESULTS SETS kimeachwa:

Utaratibu wa EmployeesInDept ni utaratibu rahisi unaoonyesha nambari za wafanyakazi na majina ya mwisho ya wafanyakazi wote wanaofanya kazi katika idara maalum. Nambari ya idara ni parameter ya utaratibu na lazima ielezwe wakati wa kuiita. Utekelezaji wa utaratibu huu hutoa meza yenye safu mbili ambazo vichwa vyake vinafanana na majina ya safu zinazofanana katika jedwali la hifadhidata, i.e. Kitambulisho na Jina la Mwisho. Ili kubadilisha vichwa vya safu wima za matokeo (pamoja na aina ya data zao), SQL Server 2012 hutumia kifungu kipya cha WITH RESULTS SETS. Matumizi ya sentensi hii yanaonyeshwa katika mfano hapa chini:

TUMIA SampuliDb; EXEC EmployeesInDept "d1" YENYE SETI ZA MATOKEO (( INT NOT NULL, [LastName] CHAR(20) NOT NULL));

Matokeo ya kutekeleza utaratibu uliohifadhiwa unaoitwa kwa njia hii itakuwa kama ifuatavyo.

Kama unavyoona, kuendesha utaratibu uliohifadhiwa kwa kutumia kifungu cha WITH RESULT SETS katika taarifa ya KUTEKELEZA hukuruhusu kubadilisha majina na aina za data za safu wima katika seti ya matokeo inayotolewa na utaratibu. Kwa hivyo, utendakazi huu mpya hutoa kubadilika zaidi katika kutekeleza taratibu zilizohifadhiwa na kuweka matokeo yao katika jedwali jipya.

Kubadilisha Muundo wa Taratibu Zilizohifadhiwa

Injini ya Hifadhidata pia inasaidia maagizo BADILISHA UTARATIBU kurekebisha muundo wa taratibu zilizohifadhiwa. Taarifa ya ALTER PROCEDURE kwa kawaida hutumiwa kubadilisha taarifa za Transact-SQL ndani ya utaratibu. Vigezo vyote vya taarifa ya ALTER PROCEDURE vina maana sawa na vigezo sawa vya taarifa ya UTARATIBU WA KUUNDA. Kusudi kuu la kutumia taarifa hii ni kuzuia kubatilisha haki zilizopo za utaratibu uliohifadhiwa.

Injini ya Hifadhidata inasaidia Aina ya data ya CURSOR. Aina hii ya data hutumiwa kutangaza vishale katika taratibu zilizohifadhiwa. Mshale ni muundo wa programu unaotumiwa kuhifadhi matokeo ya hoja (kawaida safu mlalo) na kuruhusu watumiaji kuonyesha matokeo hayo kwa safu mlalo.

Ili kufuta moja au kikundi cha taratibu zilizohifadhiwa, tumia AGIZO LA TARATIBU. Ni mmiliki au wanachama wa db_owner na sysadmin pekee majukumu wanaweza kufuta utaratibu uliohifadhiwa.

Taratibu zilizohifadhiwa na wakati wa kukimbia wa lugha ya kawaida

Seva ya SQL inaauni Muda wa Kutumika kwa Lugha ya Kawaida (CLR), ambayo hukuruhusu kuunda vipengee mbalimbali vya hifadhidata (taratibu zilizohifadhiwa, vitendaji vilivyobainishwa na mtumiaji, vichochezi, mijumuisho iliyobainishwa na mtumiaji, na aina za data maalum) kwa kutumia C# na Visual Basic. CLR pia hukuruhusu kutekeleza vitu hivi kwa kutumia mfumo wa kawaida wa kukimbia.

Muda wa matumizi ya lugha ya kawaida umewezeshwa na kuzimwa kwa kutumia chaguo cl_imewezeshwa utaratibu wa mfumo sp_configure, ambayo inazinduliwa kwa ajili ya utekelezaji kwa maelekezo WEKA UPYA. Mfano ufuatao unaonyesha jinsi unavyoweza kutumia sp_configure utaratibu wa mfumo kuwezesha CLR:

TUMIA SampuliDb; EXEC sp_configure "clr_enabled",1 RECONFIGURE

Ili kuunda, kukusanya na kuhifadhi utaratibu kwa kutumia CLR, lazima ukamilishe mlolongo ufuatao wa hatua kwa mpangilio ulioonyeshwa:

    Unda utaratibu uliohifadhiwa katika C # au Visual Basic, na kisha uundanishe kwa kutumia mkusanyaji unaofaa.

    Kwa kutumia maelekezo TUNZA MKUTANO, unda faili inayoweza kutekelezwa inayolingana.

    Tekeleza utaratibu kwa kutumia taarifa ya KUTEKELEZA.

Kielelezo hapa chini kinaonyesha mchoro wa mchoro wa hatua zilizoainishwa hapo awali. Yafuatayo ni maelezo ya kina zaidi ya mchakato huu.

Kwanza, unda programu inayohitajika katika mazingira ya maendeleo kama vile Visual Studio. Kusanya programu iliyokamilishwa kuwa nambari ya kitu kwa kutumia mkusanyaji wa C # au Visual Basic. Msimbo huu umehifadhiwa katika faili ya dynamic-link maktaba (.dll), ambayo hutumika kama chanzo cha taarifa ya CREATE ASSEMBLY, ambayo huunda msimbo wa kati unaoweza kutekelezeka. Kisha, toa taarifa ya CREATE PROCEDURE ili kuhifadhi msimbo wa utekelezaji kama kitu cha hifadhidata. Hatimaye, endesha utaratibu kwa kutumia taarifa inayojulikana ya EXECUTE.

Mfano hapa chini unaonyesha nambari ya chanzo ya utaratibu uliohifadhiwa katika C #:

Kwa kutumia System.Data.SqlClient; kutumia Microsoft.SqlServer.Server; Public part partial class StoredProcedures ( public static int CountEmployees() ( int rows; SqlConnection connection = new SqlConnection("Context Connection=true"); connection.Open(); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = "chagua count(*) kama "Idadi ya wafanyakazi" " + "kutoka kwa Mfanyakazi"; rows = (int)cmd.ExecuteScalar(); connection.Close(); rejesha safu mlalo; ) )

Utaratibu huu unatekeleza swala la kuhesabu idadi ya safu katika jedwali la Mfanyakazi. Kutumia maagizo mwanzoni mwa programu taja nafasi za majina zinazohitajika kutekeleza programu. Kutumia maagizo haya hukuruhusu kubainisha majina ya darasa katika msimbo wa chanzo bila kubainisha kwa uwazi nafasi za majina zinazolingana. Ifuatayo, darasa la Utaratibu wa Kuhifadhiwa linafafanuliwa, ambalo SqlProcedure sifa, ambayo hufahamisha mkusanyaji kwamba darasa hili ni utaratibu uliohifadhiwa. Njia ya CountEmployees() imefafanuliwa ndani ya nambari ya darasa. Uunganisho kwa mfumo wa hifadhidata huanzishwa kupitia mfano wa darasa Uunganisho wa Sql. Ili kufungua muunganisho, njia ya Open() ya mfano huu inatumiwa. A CreateCommand() mbinu hukuruhusu kufikia mfano wa darasa SqlCommnd, ambayo amri inayohitajika ya SQL inapitishwa.

Katika kijisehemu cha msimbo kifuatacho:

Cmd.CommandText = "chagua kuhesabu(*) kama "Idadi ya wafanyakazi" " + "kutoka kwa Mfanyakazi";

hutumia taarifa ya CHAGUA kuhesabu idadi ya safu kwenye jedwali la Mfanyakazi na kuonyesha matokeo. Maandishi ya amri yamebainishwa kwa kuweka mali ya CommandText ya kutofautisha kwa cmd kwa mfano uliorejeshwa na njia ya CreateCommand(). Inayofuata inaitwa TekelezaScalar() mbinu Mfano wa SqlCommand. Mbinu hii hurejesha thamani ya scalar ambayo inabadilishwa kuwa aina kamili ya data na kugawiwa kwa utofauti wa safu mlalo.

Sasa unaweza kuunda nambari hii kwa kutumia Visual Studio. Niliongeza darasa hili kwenye mradi unaoitwa CLRStoredProcedures, kwa hivyo Visual Studio itakusanya mkusanyiko wa jina moja na kiendelezi cha *.dll. Mfano hapa chini unaonyesha hatua inayofuata katika kuunda utaratibu uliohifadhiwa: kuunda msimbo unaoweza kutekelezwa. Kabla ya kuendesha msimbo katika mfano huu, unahitaji kujua eneo la faili iliyokusanywa ya dll (kawaida iko kwenye folda ya Debug ya mradi).

TUMIA SampuliDb; NENDA UUNDE TARATIBU ZA ASSEMBLY CLRStored KUTOKA "D:\Projects\CLRStoredProcedures\bin\Debug\CLRStoredProcedures.dll" KWA PERMISSION_SET = SALAMA

Taarifa ya CREATE ASSEMBLY inachukua msimbo unaodhibitiwa kama ingizo na huunda kitu sambamba ambacho unaweza kuunda taratibu zilizohifadhiwa za CLR, vitendaji vilivyobainishwa na mtumiaji na vichochezi. Agizo hili lina syntax ifuatayo:

TUNZA ASSEMBLY jina_name [ AUTHORIZATION owner_name ] KUTOKA (dll_file) Kanuni za Sintaksia

Kigezo cha kusanyiko_jina kinabainisha jina la mkusanyiko. Kipengele cha hiari cha RUHUSA kinabainisha jina la jukumu kama mmiliki wa mkutano huu. Kifungu cha FROM kinabainisha njia ambapo mkusanyiko wa kupakia iko.

KWA kifungu cha PERMISSION_SET ni kifungu muhimu sana cha taarifa ya BUNGE LA BUNGE na lazima kibainishwe kila wakati. Inafafanua seti ya ruhusa iliyotolewa kwa msimbo wa mkusanyiko. Seti ya ruhusa ya SAFE ndiyo yenye vikwazo zaidi. Msimbo wa mkutano ambao una haki hizi hauwezi kufikia rasilimali za mfumo wa nje kama vile faili. Seti ya haki za EXTERNAL_ACCESS huruhusu msimbo wa kuunganisha kufikia rasilimali fulani za mfumo wa nje, wakati seti ya UNSAFE inaruhusu ufikiaji usio na kikomo wa rasilimali ndani na nje ya mfumo wa hifadhidata.

Ili kuhifadhi maelezo ya msimbo wa mkusanyiko, ni lazima mtumiaji aweze kutoa taarifa ya KUTUNGA MKUTANO. Mmiliki wa mkusanyiko ni mtumiaji (au jukumu) kutekeleza maagizo. Unaweza kumfanya mtumiaji mwingine kuwa mmiliki wa mkusanyiko kwa kutumia kifungu cha IDHINISHA cha taarifa ya CREATE SCHEMA.

Injini ya Hifadhidata pia inasaidia taarifa za ALTER ASSEMBLY na DROP ASSEMBLY. Taarifa ya MKUTANO WA BADILISHA inayotumika kusasisha mkusanyiko hadi toleo jipya zaidi. Maagizo haya pia huongeza au kuondoa faili zinazohusiana na mkusanyiko unaolingana. dondosha maagizo ya KUSANYIKO Huondoa mkusanyiko uliobainishwa na faili zake zote zinazohusiana kutoka kwa hifadhidata ya sasa.

Mfano hapa chini unaonyesha jinsi ya kuunda utaratibu uliohifadhiwa kulingana na nambari iliyodhibitiwa uliyotekeleza hapo awali:

TUMIA SampuliDb; NENDA UUNDE UTARATIBU WA WAFANYAKAZI KAMA JINA LA NJE CLRStoredProcedures.StoredProcedures.CountEmployees.

Maagizo ya CREATE PROCEDURE katika mfano hutofautiana na maagizo sawa katika mifano iliyopita kwa kuwa ina JINA LA NJE kigezo. Chaguo hili linabainisha kuwa msimbo unatolewa na wakati wa utekelezaji wa lugha ya kawaida. Jina katika sentensi hii lina sehemu tatu:

assembly_name.class_name.method_name

    assembly_name - inaonyesha jina la mkutano;

    class_name - inaonyesha jina la darasa la jumla;

    method_name - sehemu ya hiari, inabainisha jina la njia ambayo imefafanuliwa ndani ya darasa.

Utekelezaji wa utaratibu wa Wafanyikazi wa Hesabu umeonyeshwa katika mfano hapa chini:

TUMIA SampuliDb; TANGAZA @count INT EXECUTE @count = Hesabu ya Wafanyakazi CHAPA @hesabu -- Rudisha 7

Taarifa ya PRINT inarudisha idadi ya sasa ya safu mlalo kwenye jedwali la Mfanyakazi.

Katika somo hili utajifunza jinsi kuunda na kufuta taratibu katika SQL Server(Transact-SQL) na syntax na mifano.

Maelezo

Katika Seva ya SQL, utaratibu ni programu iliyohifadhiwa ambayo unaweza kupitisha vigezo. Hairudishi thamani kama chaguo za kukokotoa. Hata hivyo, inaweza kurudisha hali ya kufaulu/kushindwa kwa utaratibu uliouita.

Tengeneza Utaratibu

Unaweza kuunda taratibu zako zilizohifadhiwa katika Seva ya SQL (Transact-SQL). Hebu tuangalie kwa karibu.

Sintaksia

Sintaksia ya taratibu katika Seva ya SQL (Transact-SQL):

TUNZA ( PROCEDURE | PROC ) procedure_name
[ @parameta aina ya data
[ INAYOTOFAUTIANA ] [ = chaguo-msingi ] [ NJE | PATO | KUSOMA PEKEE]
, @parameta aina ya data
[ INAYOTOFAUTIANA ] [ = chaguo-msingi ] [ NJE | PATO | KUSOMA ] ]
[ NA ( USIMBO | RECOMPILE | TIMIZA KAMA Kifungu )]
[KWA KUIGA]
AS
ANZA
sehemu_inayoweza kutekelezwa
MWISHO;

Vigezo au Hoja

schema_name ni jina la schema ambayo utaratibu uliohifadhiwa ni wa.
procedure_name ni jina la kupeana utaratibu huu katika Seva ya SQL.
@parameter - vigezo moja au zaidi hupitishwa kwa utaratibu.
type_schema_name ni mpangilio unaomiliki aina ya data, ikitumika.
Aina ya data — aina ya data ya @parameter .
KUtofautiana - Weka kwa vigezo vya mshale wakati seti ya matokeo ni parameta ya pato.
chaguo-msingi ni thamani chaguo-msingi ya kukabidhi kigezo cha @parameta.
OUT - Hii inamaanisha kuwa @parameter ndio parameta ya pato.
OUTPUT - Hii inamaanisha kuwa @parameta ndio kigezo cha pato.
READONLY - Hii inamaanisha kuwa @parameter haiwezi kubatilishwa na utaratibu uliohifadhiwa.
UFUMBO - Hii inamaanisha kuwa chanzo cha utaratibu uliohifadhiwa hakitahifadhiwa kama maandishi wazi katika mionekano ya mfumo wa Seva ya SQL.
RECOMPILE - Hii inamaanisha kuwa mpango wa hoja hautahifadhiwa kwa utaratibu huu uliohifadhiwa.
EXECUTE AS - Huweka muktadha wa usalama wa kutekeleza utaratibu uliohifadhiwa.
KWA KUNAGA - Hii ina maana kwamba utaratibu uliohifadhiwa unatekelezwa tu wakati wa urudufishaji.

Mfano

Hebu tuangalie mfano wa kuunda utaratibu uliohifadhiwa katika SQL Server (Transact-SQL).
Chini ni mfano rahisi wa utaratibu:

Transact-SQL

TENGENEZA UTARATIBU FindSite @site_name VARCHAR(50) NJE UNAPOANZA TANGAZA @site_id INT; WEKA @site_id = 8; IF @site_id< 10 SET @site_name = "yandex.com"; ELSE SET @site_name = "google.com"; END;

UNDA UTARATIBU FindSite

@site_name VARCHAR(50) IMETOKA

ANZA

TANGAZA @site_id INT ;

WEKA @site_id = 8 ;

IF@site_id< 10

SET @ site_name = "yandex.com" ;

VINGINEVYO

SET @site_name = "google.com" ;

MWISHO;

Utaratibu huu unaitwa FindSite. Ina kigezo kimoja kinachoitwa @site_name ambacho ni kigezo cha pato ambacho kinasasishwa kulingana na utofauti wa @site_id.

Kisha unaweza kurejelea utaratibu mpya uliohifadhiwa unaoitwa FindSite kama hii.

Katika Seva ya Microsoft SQL kutekeleza na kusasisha algorithms yako mwenyewe ( mahesabu) unaweza kutumia taratibu zilizohifadhiwa, kwa hiyo leo tutazungumzia jinsi zimeundwa, kubadilishwa na kufutwa.

Lakini kwanza, nadharia kidogo ili uelewe ni taratibu gani zilizohifadhiwa na kwa nini zinahitajika katika T-SQL.

Kumbuka! Kwa waandaaji wa programu wanaoanza, ninapendekeza nyenzo zifuatazo muhimu kwenye T-SQL:

  • Kwa utafiti wa kina zaidi wa lugha ya T-SQL, napendekeza pia kusoma kitabu - Njia ya Mtayarishaji wa T-SQL. Mafunzo juu ya lugha ya Transact-SQL;
  • Kozi za kitaalamu mtandaoni kwenye T-SQL

Je! ni taratibu gani zilizohifadhiwa katika T-SQL?

Taratibu zilizohifadhiwa- hivi ni vitu vya hifadhidata ambavyo vina algorithm katika mfumo wa seti ya maagizo ya SQL. Kwa maneno mengine, tunaweza kusema kwamba taratibu zilizohifadhiwa ni programu ndani ya hifadhidata. Taratibu zilizohifadhiwa hutumiwa kuhifadhi nambari inayoweza kutumika tena kwenye seva, kwa mfano, uliandika algorithm fulani, hesabu ya mlolongo au taarifa ya hatua nyingi ya SQL, na ili usitekeleze maagizo yote yaliyojumuishwa kwenye algorithm hii kila wakati, unaweza kuibadilisha. kama utaratibu uliohifadhiwa. Wakati huo huo, unapounda utaratibu wa SQL, seva inakusanya msimbo, na kisha, kila wakati unapoendesha utaratibu huu wa SQL, seva haitairudisha.

Ili kutekeleza utaratibu uliohifadhiwa katika Seva ya SQL, lazima uandike amri ya EXECUTE kabla ya jina lake; inawezekana pia kufupisha amri hii kama EXEC. Kuita utaratibu uliohifadhiwa katika taarifa ya SELECT, kwa mfano, kama kazi haitafanya kazi tena, i.e. taratibu zinazinduliwa tofauti.

Katika taratibu zilizohifadhiwa, tofauti na kazi, tayari inawezekana kufanya shughuli za kurekebisha data kama vile: UNSERT, UPDATE, DELETE. Unaweza pia kutumia taarifa za SQL za karibu aina yoyote katika taratibu, kwa mfano, CREATE TABLE kuunda meza au EXECUTE, i.e. kuita taratibu nyingine. Isipokuwa ni aina kadhaa za maagizo, kama vile: kuunda au kubadilisha vitendaji, maoni, vichochezi, kuunda schema na maagizo mengine kadhaa sawa, kwa mfano, huwezi kubadilisha muktadha wa unganisho la hifadhidata (TUMIA) katika utaratibu uliohifadhiwa.

Utaratibu uliohifadhiwa unaweza kuwa na vigezo vya pembejeo na vigezo vya pato, inaweza kurudisha data ya tabular, au haiwezi kurudisha chochote, fanya tu maagizo yaliyomo.

Taratibu zilizohifadhiwa ni muhimu sana, hutusaidia kufanya otomatiki au kurahisisha shughuli nyingi, kwa mfano, unahitaji kila wakati kutoa ripoti ngumu za uchambuzi kwa kutumia majedwali ya egemeo, i.e. Opereta wa PIVOT. Ili kurahisisha kuunda maswali na mwendeshaji huyu ( kama unavyojua, syntax ya PIVOT ni ngumu sana), Unaweza kuandika utaratibu ambao utazalisha ripoti za muhtasari kwa nguvu kwako, kwa mfano, nyenzo "Dynamic PIVOT katika T-SQL" hutoa mfano wa kutekeleza kipengele hiki kwa namna ya utaratibu uliohifadhiwa.

Mifano ya kufanya kazi na taratibu zilizohifadhiwa katika Seva ya Microsoft SQL

Data ya chanzo kwa mifano

Mifano yote hapa chini itaendeshwa katika Microsoft SQL Server 2016 Express. Ili kuonyesha jinsi taratibu zilizohifadhiwa zinavyofanya kazi na data halisi, tunahitaji data hii, wacha tuiunda. Kwa mfano, wacha tuunde jedwali la majaribio na tuongeze rekodi kadhaa kwake, tuseme kwamba itakuwa meza iliyo na orodha ya bidhaa na bei zao.

Maagizo ya kuunda jedwali TUNZA Jedwali la Kujaribu la TABLE( INT IDENTITY(1,1) NOT NULL, INT NOT NULL, VARCHAR(100) NOT NULL, MONEY NULL) GO -- Maagizo ya kuongeza data WEKA INTO TestTable(CategoryId, ProductName, Price) THAMANI (1 , "Kipanya", 100), (1, "Kibodi", 200), (2, "Simu", 400) NENDA --Chagua hoja CHAGUA * KUTOKA Jedwali la Kujaribu


Tuna data, sasa hebu tuendelee kuunda taratibu zilizohifadhiwa.

Kuunda utaratibu uliohifadhiwa katika T-SQL - taarifa ya CREATE PROCEDURE

Taratibu zilizohifadhiwa zinaundwa kwa kutumia taarifa TENGENEZA UTARATIBU, baada ya maagizo haya lazima uandike jina la utaratibu wako, basi, ikiwa ni lazima, fafanua vigezo vya pembejeo na pato katika mabano. Baada ya hayo, unaandika neno kuu AS na kufungua kizuizi cha maagizo na neno kuu BEGIN, funga kizuizi hiki na neno END. Ndani ya kizuizi hiki, unaandika maagizo yote ambayo yanatekeleza algorithm yako au aina fulani ya hesabu ya mlolongo, kwa maneno mengine, unapanga programu katika T-SQL.

Kwa mfano, hebu tuandike utaratibu uliohifadhiwa ambao utaongeza rekodi mpya, i.e. bidhaa mpya kwenye jedwali letu la majaribio. Ili kufanya hivyo, tutafafanua vigezo vitatu vya ingizo: @CategoryId - kitambulisho cha aina ya bidhaa, @ProductName - jina la bidhaa na @Price - bei ya bidhaa; kigezo hiki kitakuwa cha hiari, i.e. haitakuwa muhimu kuipitisha kwa utaratibu ( kwa mfano, hatujui bei bado), kwa kusudi hili tutaweka thamani ya msingi katika ufafanuzi wake. Vigezo hivi ni katika mwili wa utaratibu, i.e. kwenye BEGIN...END block inaweza kutumika, kama vile vigeu vya kawaida ( Kama unavyojua, viambishi vinaonyeshwa na @ ishara) Ikiwa unahitaji kutaja vigezo vya pato, basi baada ya jina la parameta onyesha neno kuu OUTPUT ( au OUT kwa kifupi).

Katika BEGIN...END block tutaandika maagizo ya kuongeza data, na pia maagizo CHAGUA mwishoni mwa utaratibu, ili utaratibu uliohifadhiwa utaturudishia data ya jedwali kuhusu bidhaa katika kitengo maalum, kwa kuzingatia. akaunti bidhaa mpya, iliyoongezwa hivi punde. Pia katika utaratibu huu uliohifadhiwa, niliongeza usindikaji wa parameter inayoingia, yaani, kuondoa nafasi za ziada mwanzoni na mwisho wa kamba ya maandishi ili kuondokana na hali ambapo nafasi kadhaa ziliingia kwa ajali.

Hapa kuna nambari ya utaratibu huu ( Pia nilitoa maoni juu yake).

Unda utaratibu TENGENEZA UTARATIBU wa Utaratibu wa Mtihani (--Vigezo vya Ingizo @CategoryId INT, @ProductName VARCHAR(100), @Price MONEY = 0) AS ANZA --Maelekezo yanayotekeleza kanuni yako --Kuchakata vigezo vinavyoingia --Kuondoa nafasi za ziada mwanzoni. na mwisho wa mstari wa maandishi SET @ProductName = LTRIM(RTRIM(@ProductName)); --Ongeza rekodi mpya WEKA NDANI YA Jedwali la Kujaribu(CategoryId, ProductName, Price) THAMANI (@CategoryId, @ProductName, @Price) --Rudisha data CHAGUA * KUTOKA TestTable WHERE CategoryId = @CategoryId END GO


Kuendesha utaratibu uliohifadhiwa katika T-SQL - EXECUTE amri

Unaweza kuendesha utaratibu uliohifadhiwa, kama nilivyoona tayari, kwa kutumia amri ya EXECUTE au EXEC. Vigezo vinavyoingia hupitishwa kwa taratibu kwa kuorodhesha tu na kutaja maadili yanayofaa baada ya jina la utaratibu ( kwa vigezo vya pato unahitaji pia kutaja amri ya OUTPUT) Hata hivyo, majina ya vigezo hayawezi kutajwa, lakini katika kesi hii ni muhimu kufuata mlolongo wa kutaja maadili, i.e. taja maadili kwa mpangilio ambao vigezo vya kuingiza vinafafanuliwa ( hii inatumika pia kwa vigezo vya pato).

Vigezo ambavyo vina maadili chaguo-msingi hazihitaji kubainishwa; hivi ndivyo vinavyoitwa vigezo vya hiari.

Hapa kuna njia chache tofauti lakini zinazolingana za kutekeleza taratibu zilizohifadhiwa, haswa utaratibu wetu wa jaribio.

1. Piga utaratibu bila kubainisha bei TIMIZA Utaratibu wa Mtihani @CategoryId = 1, @ProductName = "Jaribio la bidhaa 1" --2. Piga simu kwa utaratibu unaoonyesha bei ya EXEC TestProcedure @CategoryId = 1, @ProductName = "Bidhaa ya majaribio 2", @Price = 300 --3. Piga utaratibu bila kutaja jina la vigezo EXEC TestProcedure 1, "Jaribio la bidhaa 3", 400


Kubadilisha utaratibu uliohifadhiwa kuwa T-SQL - ALTER PROCEDURE taarifa

Unaweza kufanya mabadiliko kwa algorithm ya utaratibu kwa kutumia maelekezo BADILISHA UTARATIBU. Kwa maneno mengine, ili kubadilisha utaratibu uliopo tayari, unahitaji tu kuandika ALTER PROCEDURE badala ya CREATE PROCEDURE, na kubadilisha kila kitu kingine kama ni lazima.

Wacha tuseme tunahitaji kufanya mabadiliko kwa utaratibu wetu wa jaribio, sema parameta ya @Price, i.e. bei, tutaifanya kuwa ya lazima, kwa hili tutaondoa thamani ya msingi, na pia fikiria kwamba hatuhitaji tena kupata seti ya data inayosababisha, kwa hili tutaondoa tu taarifa ya SELECT kutoka kwa utaratibu uliohifadhiwa.

Tunabadilisha utaratibu ALTER PROCEDURE TestProcedure (--Vigezo vinavyoingia @CategoryId INT, @ProductName VARCHAR(100), @Price MONEY) AS ANZA --Maelekezo yanayotekeleza kanuni yako --Kuchakata vigezo vinavyoingia --Kuondoa nafasi za ziada mwanzoni na mwisho wa mistari ya maandishi SET @ProductName = LTRIM(RTRIM(@ProductName)); --Ongeza rekodi mpya INGIZA KWENYE Jedwali la Kujaribu(CategoryId, Jina la Bidhaa, Bei) THAMANI (@CategoryId, @ProductName, @Price) END GO

Kufuta utaratibu uliohifadhiwa katika taarifa ya T-SQL - DROP PROCEDURE

Ikiwa ni lazima, unaweza kufuta utaratibu uliohifadhiwa; hii inafanywa kwa kutumia maagizo UTARATIBU WA KUONDOA.

Kwa mfano, hebu tufute utaratibu wa majaribio tuliyounda.

DONDOSHA UTARATIBU WA Mtihani

Wakati wa kufuta taratibu zilizohifadhiwa, inafaa kukumbuka kuwa ikiwa utaratibu unarejelewa na taratibu zingine au taarifa za SQL, baada ya kufutwa, watashindwa na kosa, kwani utaratibu wanaorejelea haupo tena.

Hiyo ndiyo yote niliyo nayo, natumaini nyenzo hiyo ilikuwa ya kuvutia na yenye manufaa kwako, kwaheri!