Saxlanılan prosedurlar və onların istifadəsi. T-SQL-də saxlanılan prosedurun silinməsi DROP PROCEDURE ifadəsidir. Saxlanılan Prosedurun İcrası

Prosedurlarınıza xətti daxil edin - SET NOCOUNT ON:

Hər bir DML ifadəsi ilə SQL server diqqətlə bizə emal edilmiş qeydlərin sayını ehtiva edən bir mesaj qaytarır. Bu məlumat kodu sazlayarkən bizim üçün faydalı ola bilər, lakin bundan sonra tamamilə faydasız olacaq. SET NOCOUNT ON yazmaqla bu funksiyanı ləğv edirik. Çoxsaylı ifadələr və ya döngələr olan saxlanılan prosedurlar üçün bu hərəkət performansı əhəmiyyətli dərəcədə artıra bilər, çünki trafikin miqdarı əhəmiyyətli dərəcədə azalacaq.

Transact SQL

Sxem adını obyekt adı ilə istifadə edin:

Yaxşı, məncə, aydındır. Bu əməliyyat serverə obyektləri harada axtarmaq lazım olduğunu söyləyir və zibil qutularını təsadüfi qarışdırmaq əvəzinə, hara getməli olduğunu və nə götürəcəyini dərhal biləcək. Çoxlu sayda verilənlər bazası, cədvəllər və saxlanılan prosedurlarla o, vaxtımıza və əsəblərimizə əhəmiyyətli dərəcədə qənaət edə bilər.

Transact SQL

SEÇİN * dbo.MyTable-DƏN -- Bu, yaxşı bir şeydir -- SEÇİN * Əvəzində MyTable-DƏN -- Bu pis bir şeydir -- EXEC proseduruna zəng edin dbo.MyProc -- Yenə yaxşıdır -- EXEC MyProc əvəzinə --Pis!

Saxlanılan prosedur adlarınızda "sp_" prefiksini istifadə etməyin:

Prosedur adımız "sp_" ilə başlayırsa, SQL Serverəvvəlcə onun əsas bazasına baxacaq. Fakt budur ki, bu prefiks serverin şəxsi daxili saxlanılan prosedurları üçün istifadə olunur. Buna görə də, verilənlər bazasında sizinkinizlə eyni adlı prosedur aşkar edilərsə, onun istifadəsi əlavə xərclərə və hətta səhv nəticələrə səbəb ola bilər.

IF EXISTS (SEÇİN *) əvəzinə ƏGƏR MÖVCUDDUR (SEÇİN 1) istifadə edin:

Başqa cədvəldə qeydin olub-olmadığını yoxlamaq üçün IF EXISTS ifadəsindən istifadə edirik. Bu ifadə daxili ifadədən ən azı bir dəyər qaytarıldıqda doğru qaytarır, bunun "1", bütün sütunlar və ya cədvəlin əhəmiyyəti yoxdur. Qaytarılan məlumatlar, prinsipcə, heç bir şəkildə istifadə edilmir. Beləliklə, məlumatların ötürülməsi zamanı trafiki sıxışdırmaq üçün aşağıda göstərildiyi kimi "1"dən istifadə etmək daha məntiqlidir.

Saxlanılan prosedurlar

Bu fəslin mövzusu biznes məntiqini həyata keçirmək üçün InterBase verilənlər bazası proqram tərtibatçılarına təklif olunan ən güclü alətlərdən biridir.Sahdalanan prosedurlar (ingiliscə, stoied procedures) verilənlər bazası səviyyəsində tətbiq məntiqinin əhəmiyyətli hissəsini həyata keçirməyə imkan verir və beləliklə, bütün tətbiqin performansı, verilənlərin emalının mərkəzləşdirilməsi və əldə edilən tapşırıqların yerinə yetirilməsi üçün tələb olunan kodun miqdarının azaldılması Demək olar ki, hər hansı kifayət qədər mürəkkəb verilənlər bazası proqramı saxlanılan prosedurların istifadəsini tələb edir.
Əksər əlaqəli verilənlər bazası sistemləri üçün ümumi olan saxlanılan prosedurlardan istifadənin bu məlum üstünlüklərinə əlavə olaraq, InterBase saxlanan prosedurları, adi SQL sorğularında qaytardıqları nəticələrdən istifadə etməyə imkan verən demək olar ki, tam verilənlər toplusu rolunu oynaya bilər.
Çox vaxt təcrübəsiz tərtibatçılar saxlanılan prosedurları verilənlər bazasında nəyisə yerinə yetirən xüsusi SQL sorğuları toplusu kimi düşünürlər və belə bir fikir var ki, saxlanılan prosedurlarla işləmək eyni funksionallığı müştəri proqramında, yüksək səviyyəli proqramlarda tətbiq etməkdən qat-qat çətindir. səviyyəli dil
Beləliklə, InterBase-də saxlanılan prosedurlar nədən ibarətdir?
Saxlanılan prosedur (SP) verilənlər bazası metaməlumatlarının bir hissəsidir, bu, InterBase-in daxili təqdimatında tərtib edilmiş, xüsusi dildə yazılmış, tərtibçisi InteiBase serverinin nüvəsində qurulmuş alt proqramdır.
Saxlanılan prosedur müştəri proqramlarından, tetikleyicilerden və digər saxlanılan prosedurlardan çağırıla bilər. Saxlanılan prosedur server prosesində yerinə yetirilir və verilənlər bazasındakı məlumatları manipulyasiya edə, həmçinin onun icrasının nəticələrini onu çağıran müştəriyə qaytara bilər (yəni trigger, HP, proqram)
HP-yə xas olan güclü imkanların əsasını həm INSERT, UPDATE və SELECT kimi dəyişdirilmiş adi SQL ifadələrini, həm də budaqlanma və dövrələmə alətlərini (IF, WHILE), eləcə də xətaların idarə edilməsi alətlərini özündə birləşdirən prosedur proqramlaşdırma dili təşkil edir. .və müstəsna hallar Saxlanılan prosedurların dili verilənlərlə işləmək üçün mürəkkəb alqoritmləri həyata keçirməyə imkan verir və əlaqəli verilənlərlə işləməyə diqqət yetirildiyi üçün SP-lər ənənəvi dillərdəki analoji prosedurlara nisbətən daha yığcamdır.
Qeyd etmək lazımdır ki, bir sıra xüsusiyyətlər və məhdudiyyətlər istisna olmaqla, eyni proqramlaşdırma dili triggerlər üçün istifadə olunur. Tətiklərdə istifadə olunan dilin alt çoxluğu ilə HP dili arasındakı fərqlər Triggerlər fəslində (1-ci hissə) ətraflı müzakirə olunur.

Sadə saxlanılan prosedurun nümunəsi

İlk saxlanılan proseduru yaratmağın və ondan saxlanılan prosedurların yaradılması prosesini öyrənmək üçün nümunə kimi istifadə etməyin vaxtıdır. Ancaq əvvəlcə saxlanılan prosedurlarla necə işləmək barədə bir neçə söz söyləmək lazımdır.Fakt budur ki, HP qaranlıq və əlverişsiz alət kimi şöhrətini saxlanılan prosedurların işlənib hazırlanması və sazlanması üçün son dərəcə zəif standart alətlərə borcludur. InterBase sənədlərində isql tərcüməçisinə qidalanan CP-nin mətnini ehtiva edən SQL skript fayllarından istifadə edərək prosedurların yaradılması və beləliklə də CP-nin yaradılması və dəyişdirilməsi tövsiyə olunur.Xəta baş verərsə, isql hansı mesajı göstərəcək. SQL skript faylının xəttində xəta baş verdi. Səhvi düzəldin və hər şeyi yenidən təkrarlayın. Sözün müasir mənasında sazlama, yəni dəyişənlərin aralıq dəyərlərinə baxmaq imkanı ilə icra izlənməsi ümumiyyətlə müzakirə edilmir. Aydındır ki, bu yanaşma tərtibatçının gözündə saxlanılan prosedurların cəlbediciliyinin artmasına kömək etmir.
Bununla belə, HP-nin inkişafına standart minimalist yanaşma ilə yanaşı<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
Saxlanılan prosedurların sintaksisi aşağıdakı kimi təsvir edilmişdir:

PROSEDURUN adını YARATIN
[ (param datatype [, param datatype...]) ]
)]
AS
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
DECLARE VARIABLE var datatype;

=
BAŞLAYIN
< compound_statement>
[< compound_statement> ...]
SON
< compound_statement> = (açıqlama;)

Kifayət qədər həcmli görünür və hətta çətin ola bilər, amma əslində hər şey çox sadədir.Sintaksisi tədricən mənimsəmək üçün, tədricən daha mürəkkəb nümunələrə çevrilməyə baxaq.
Beləliklə, burada iki ədədi giriş kimi qəbul edən, onları əlavə edən və nəticəni qaytaran çox sadə saxlanılan prosedura nümunə verilmişdir:

PROSEDURU YARAT SP_Əlavə et(birinci_arg İKİ DƏQİQLİK,
second_arg İKİLİ DƏqiqlik)
GERİ DÖNÜŞLƏR (Nəticə ikiqat dəqiqlik)
AS
BAŞLAYIN
Nəticə=first_arg+second_arg;
dayandırmaq;
SON

Gördüyünüz kimi, hər şey sadədir: CREATE PROCEDURE əmrindən sonra yeni yaradılmış prosedurun adı göstərilir (bu verilənlər bazası daxilində unikal olmalıdır) - bu halda SP_Add, sonra XP giriş parametrləri - first_arg və second_arg - mötərizədə vergüllə ayrılaraq - növlərini göstərməklə verilmişdir.
Giriş parametrlərinin siyahısı CREATE PROCEDURE bəyanatının isteğe bağlı hissəsidir - elə hallar olur ki, prosedur öz işi üçün bütün məlumatları prosedur orqanının daxilindəki cədvəllərə sorğular vasitəsilə alır.

Saxlanılan prosedurlar istənilən skalyar məlumat növlərindən istifadə edir InteiBase Massivlərdən və istifadəçi tərəfindən təyin olunan növlərdən - domenlərdən istifadə etmir

Sonra RETURNS açar sözü gəlir, bundan sonra qaytarma parametrləri onların növlərini göstərən mötərizədə verilmişdir - bu halda, yalnız bir - Nəticə.
Əgər prosedur parametrləri qaytarmalı deyilsə, o zaman RETURNS sözü və qaytarılan parametrlərin siyahısı yoxdur.
RETURNSQ-dan sonra AS açar sözü gəlir. AS açar sözü getməzdən əvvəl başlıq, və ondan sonra - techo prosedurlar.
Saxlanılan prosedurun gövdəsi onun daxili (yerli) dəyişənlərinin bəyannamələrinin siyahısıdır (əgər varsa, aşağıda daha ətraflı müzakirə olunacaq), nöqtəli vergül (;) ilə ayrılmış və BEGIN END ifadəsinin mötərizəsinə alınmış ifadələr blokudur. Bu halda, CP-nin gövdəsi çox sadədir - biz iki giriş arqumentini əlavə etməyi və onların nəticəsini çıxışa təyin etməyi xahiş edirik və sonra SUSPEND əmrini çağırırıq. Bir az sonra bu əmrin hərəkətinin mahiyyətini izah edəcəyik, lakin hələlik yalnız qeyd edəcəyik ki, geri qaytarma parametrlərini saxlanılan prosedurun haradan çağırıldığına ötürmək lazımdır.

Saxlanan prosedurlardakı ayırıcılar

Qeyd edək ki, prosedur daxilində ifadə nöqtəli vergül (;) ilə bitir. Bildiyiniz kimi, nöqtəli vergül SQL-də standart əmr ayırıcısıdır - bu, SQL tərcüməçisinə əmrin mətninin tam daxil edildiyi və onun emal edilməli olduğu barədə siqnaldır. Belə olmazmı ki, SP-nin ortasında nöqtəli vergül taparaq, SQL tərcüməçisi əmrin tam daxil edildiyini hesab edəcək və saxlanılan prosedurun bir hissəsini yerinə yetirməyə çalışacaq? Bu fərziyyə mənasız deyil. Həqiqətən, yuxarıdakı nümunəni yazmaq üçün bir fayl yaratsanız, verilənlər bazası bağlantısı əmri əlavə edin və isql tərcüməçisindən istifadə edərək bu SQL skriptini yerinə yetirməyə çalışsanız, tərcüməçinin fikrincə, gözlənilməz bir səhvlə əlaqəli bir səhv qaytarılacaq. saxlanılan prosedur yaratmaq əmri. Xüsusi InterBase tərtibatçı alətlərindən istifadə etmədən SQL skript fayllarından istifadə edərək saxlanılan prosedurları yaradırsınızsa, HP onu geri qaytaran mətndən sonra skript əmr ayırıcısını nöqtəli vergüldən başqa başqa simvola dəyişməlisiniz. SQL cümlə ayırıcısını dəyişdirən isql əmri belə görünür:

MÜDDƏT SET

Saxlanılan prosedur yaratmaq üçün tipik bir vəziyyət üçün bu belə görünür:

MÜDDƏT QƏDƏRİ ^;
PROSEDÜR YARADIN bəzi_prosedur
... . .
SON
^
MÜDDƏT VERİN ;^

Saxlanılan prosedurun çağırılması

Ancaq saxlanılan prosedurumuza qayıdın. İndi o yaradılmışdır, biz onu birtəhər çağırmalı, parametrləri ona ötürməli və qaytarılmış nəticələri almalıyıq. Bunu etmək çox asandır - sadəcə aşağıdakı formada SQL sorğusu yazın:

SEÇİN *
FROM Sp_add(181.35, 23.09)

Bu sorğu bizə 181.35 və 23.09, yəni 204.44 rəqəmlərinin cəmini ehtiva edən yalnız bir Nəticə sahəsini ehtiva edən bir sıra qaytaracaq.
Beləliklə, bizim prosedurumuz həm müştəri proqramlarında, həm də digər SP-lərdə və ya tetikleyicilərdə yerinə yetirilən adi SQL sorğularında istifadə edilə bilər. Prosedurumuzun bu şəkildə istifadəsi saxlanılan prosedurun sonunda SUSPEND əmrindən istifadə etməklə mümkün olur.
Fakt budur ki, InterBase-də (və onun bütün klonlarında) iki növ saxlanılan prosedurlar var: seçilən prosedurlar və icra olunan prosedurlar. Bu iki növ CP-nin işindəki fərq ondan ibarətdir ki, seçim prosedurları adətən verilənlər toplusuna bənzəyən sətir-sətir qruplaşdırılmış bir çox çıxış parametrləri dəstini qaytarır və icra olunan prosedurlar ya parametrləri heç qaytara bilməz, ya da yalnız birini qaytara bilər. Qayıdışlarda sadalanan çıxış parametrləri dəsti, burada bir sətir parametrlər. Seçmə prosedurları SELECT sorğularında, icra olunan prosedurlar isə EXECUTE PROCEDURE əmri ilə çağırılır.
Saxlanılan prosedurların hər iki növü eyni yaratma sintaksisinə malikdir və formal olaraq eynidir, ona görə də hər hansı icra olunan prosedur SELECT sorğusunda çağırıla bilər və istənilən seçmə proseduru EXECUTE PROCEDURE-dən istifadə etməklə çağırıla bilər. Sual, HP-nin nə vaxt özünü necə aparacağıdır fərqli növlər zəng edin. Başqa sözlə, fərq müəyyən bir zəng növü üçün prosedurun dizaynındadır. Yəni, SEÇİM sorğusundan çağırılmaq üçün xüsusi olaraq seçmə proseduru yaradılır və icra edilə bilən prosedur isə EXECUTE PROCEDURE-dən istifadə etməklə çağırılmaq üçün xüsusi olaraq yaradılır. Bu iki növ HP-nin dizaynında hansı fərqlərin olduğuna baxaq.
Seçim prosedurunun necə işlədiyini başa düşmək üçün nəzəriyyəyə bir az daha dərindən getməlisiniz. Gəlin SELECT ID, NAME FROM Table_example kimi normal SQL sorğusunu təsəvvür edək. Onun icrası nəticəsində çıxışda iki sütundan (ID və NAME) və müəyyən sayda sətirdən (Cədvəl_misal cədvəlindəki sətirlərin sayına bərabər) ibarət cədvəl alırıq. Bu sorğu ilə qaytarılan cədvəl də çoxluq adlanır. SQL məlumatları Gəlin bu sorğunun yerinə yetirilməsi zamanı verilənlər toplusunun necə formalaşdığını düşünək.Server sorğunu qəbul etdikdən sonra onun hansı cədvəllərə aid olduğunu müəyyənləşdirir, sonra isə bu cədvəllərdən hansı alt çoxluqların sorğunun nəticəsinə daxil edilməli olduğunu öyrənir. Sonra, server sorğunun nəticələrini təmin edən hər bir qeydi oxuyur, ondan tələb olunan sahələri seçir (bizim vəziyyətimizdə bunlar ID və NAME) və onları müştəriyə göndərir. Sonra proses yenidən təkrarlanır - və hər bir seçilmiş qeyd üçün.
Bütün bu təxribat ona görə lazımdır ki, əziz oxucu başa düşsün ki, bütün SQL məlumat dəstləri sətir-sətir, o cümlədən saxlanılan prosedurlarda formalaşır! Seçmə prosedurları ilə icra edilə bilən prosedurlar arasındakı əsas fərq ondan ibarətdir ki, birincilər çoxlu sətirləri qaytarmaq üçün, ikincilər isə yalnız birini qaytarmaq üçün nəzərdə tutulmuşdur. Buna görə də, onlar fərqli şəkildə tətbiq olunur: seçim proseduru SELECT əmri ilə çağırılır və bu, qaytara biləcəyi bütün qeydləri qaytarmaq üçün proseduru "tələb edir". İcra edilə bilən prosedur, CP-dən yalnız bir sətir "çıxaran" və qalanlarına məhəl qoymayan (mövcud olsa belə!) EXECUTE PROCEDURE istifadə edərək çağırılır.
Daha aydın olması üçün seçim prosedurunun nümunəsinə baxaq. Bağışlamaq üçün gəlin SELECT ID, NAME FROM Table_Example sorğusu kimi işləyən saxlanılan prosedur yaradaq, yəni o, sadəcə olaraq bütün cədvəldən ID və NAME sahələrini seçir. Həmin nümunə budur:

PROSEDUR YARADIN Sadə_Seç_SP
QAYITIRLAR (
procID INTEGER,
procNAME VARCHAR(80))
AS
BAŞLAYIN
ÜÇÜN
İD SEÇİN, ADI cədvəldən_misal
INTO:procID, :procNAME
EDİN
BAŞLAYIN
dayandırmaq;
SON
SON

Simple_Select_SP adlanan bu prosedurun hərəkətlərinə nəzər salaq. Gördüyünüz kimi, onun giriş parametrləri yoxdur və iki çıxış parametri var - ID və NAME. Ən maraqlısı, əlbəttə ki, prosedurun bədənində yatır. FOR SELECT konstruksiyasından burada istifadə olunur:

ÜÇÜN
İD SEÇİN, ADI cədvəldən_misal
INTO:procID, :procNAME
EDİN
BAŞLAYIN

/*procID və procName dəyişənləri ilə bir şey edin*/

SON

Bu kod parçası aşağıdakı mənaları ifadə edir: Table_example cədvəlindən seçilmiş hər bir sıra üçün seçilmiş dəyərləri procID və procName dəyişənlərinə qoyun və sonra bu dəyişənlər üzərində bəzi hərəkətlər edin.
Təəccüblənmiş üzünü qoyub soruşa bilərsiniz: "Dəyişənlər? Başqa hansı dəyişənlər 9?" Bu, saxlanılan prosedurlarda dəyişənlərdən istifadə edə bilməyimiz bu fəslin bir növ sürprizidir. XP-də siz həm öz yerli dəyişənlərinizi prosedur daxilində elan edə, həm də giriş və çıxış parametrlərini dəyişənlər kimi istifadə edə bilərsiniz.
Saxlanılan prosedurda lokal dəyişəni elan etmək üçün siz onun bəyanını AS açar sözündən sonra və ilk BEGIN sözündən əvvəl yerləşdirməlisiniz.Lokal dəyişən elanı belə görünür:

DƏYİŞƏNİ ELAN EDİN ;

Məsələn, Mylnt tam yerli dəyişənini elan etmək üçün AS və BEGIN arasında aşağıdakı bəyannaməni daxil etməlisiniz.

DƏYİŞƏNLƏRİ ELAN EDİN MyInt BÜTÜN;

Nümunəmizdəki dəyişənlər iki nöqtə ilə başlayır. Bu ona görə edilir ki, onlara FOR SELECT SQL əmri daxilində daxil olursunuz, ona görə də SELECT-də istifadə olunan cədvəllər və dəyişənlər arasında sahələri ayırd etmək üçün siz sonuncudan əvvəl iki nöqtə qoymalısınız. Axı dəyişənlər cədvəllərdəki sahələrlə tam olaraq eyni ada malik ola bilər!
Lakin dəyişən adından əvvəl iki nöqtə yalnız SQL sorğularında istifadə edilməlidir. Mətnlərdən kənar dəyişənə iki nöqtə olmadan daxil olur, məsələn:

procName="Bəzi ad";

Ancaq prosedurumuzun bədəninə qayıdaq. FOR SELECT bəndi məlumatları cədvəl şəklində deyil - verilənlər dəsti, lakin hər dəfə bir sıra qaytarır. Hər bir qaytarılan sahə öz dəyişənində yerləşdirilməlidir: ID => procID, NAME => procName. DO hissəsində bu dəyişənlər SUSPEND əmrindən istifadə edərək p>prosedurunu çağıran müştəriyə göndərilir.
Beləliklə, FOR SELECT... DO əmri əmrin SELECT hissəsində seçilmiş qeydlər arasında dövr edir. DO hissəsinin formalaşdırdığı döngənin gövdəsində növbəti yaradılan qeyd SUSPEND əmrindən istifadə edərək müştəriyə ötürülür.
Beləliklə, seçim proseduru bir və ya daha çox cərgəni qaytarmaq üçün nəzərdə tutulmuşdur, bunun üçün CP-nin gövdəsi daxilində bir döngə təşkil edilir, nəticədə dəyişən parametrləri doldurur. Və bu döngənin gövdəsinin sonunda müştəriyə növbəti məlumat sırasını qaytaracaq SUSPEND əmri var.

Döngələr və filial operatorları

Müəyyən bir seçimin qeydləri vasitəsilə dövrü təşkil edən FOR SELECT... DO əmrindən əlavə, dövrənin başqa bir növü də mövcuddur - WHILE...DO, istənilən şərtlərin yoxlanılması əsasında dövrü təşkil etməyə imkan verir. WHILE..DO dövrəsindən istifadə edən HP nümunəsi buradadır. Bu prosedur 0-dan 99-a qədər olan tam ədədlərin kvadratlarını qaytarır:

PROCEDJRE QUAD YARADIN
GERİ DÖNÜŞLƏR (QUADRAT BÜTÜN)
AS
VARIABLE I INTEGER ELAN EDİN;
BAŞLAYIN
i = 1;
WHILE (i<100) DO
BAŞLAYIN
QUADRAT=I*I;
I=I+1;
dayandırmaq;
SON
SON

SELECT FROM QUAD sorğusunun icrası nəticəsində biz 1-dən 99-a qədər tam ədədlərin kvadratlarının olacağı bir QUADRAT sütunundan ibarət cədvəl alacağıq.
Saxlanılan prosedur dili SQL sorğusunun və klassik dövrənin nəticələrini təkrarlamaqdan əlavə, hər hansı \şərtlərin yerinə yetirilməsindən asılı olaraq budaqlanmanı təşkil etməyə imkan verən ƏGƏR...SONRA..ELSE ifadəsindən istifadə edir.Onun sintaksisi belədir. Pascal və C kimi yüksək səviyyəli proqramlaşdırma dillərindəki əksər filial ifadələrinə bənzəyir.
Aşağıdakıları yerinə yetirən saxlanılan prosedurun daha mürəkkəb nümunəsinə baxaq.

  1. Cədvəl_misal cədvəlində orta qiyməti hesablayır ("Cədvəllərin əsas açarları və generatorları" bölməsinə baxın)
  2. Bundan sonra, cədvəldəki hər bir giriş üçün o, aşağıdakı yoxlamanı həyata keçirir, əgər mövcud qiymət (QİYMƏT) orta qiymətdən böyükdürsə, qiyməti orta qiymətə əlavə olaraq müəyyən edilmiş sabit faizə bərabərləşdirir.
  3. Əgər cari qiymət orta qiymətdən azdırsa və ya ona bərabərdirsə, qiyməti əvvəlki qiymətə üstəgəl köhnə və orta qiymət arasındakı fərqin yarısına bərabər qiymət qoyur.
  4. Cədvəldəki bütün dəyişdirilmiş sətirləri qaytarır.

Əvvəlcə HP-nin adını, eləcə də giriş və çıxış parametrlərini müəyyən edək.Bütün bunlar saxlanılan prosedurun başlığında yazılıb.

PROSEDUR YARADIN Qiymətləri Artırın(
Faiz2İkiqat Dəqiqliyi Artırın)
GERİ DÖNÜŞLƏR (ID INTEGER, NAME VARCHAR(SO), yeni_qiymət DOUBLE
Dəqiqlik kimi

Prosedura IncreasePrices adlanacaq, o, DOUBLE PRECISION tipli bir Peiceni21nciease giriş parametrinə və 3 çıxış parametrinə malikdir - ID, NAME və new_pnce. Qeyd edək ki, ilk iki çıxış parametri işləyəcəyimiz Table_example cədvəlindəki sahələrlə eyni adlara malikdir.Buna saxlanılan prosedur dilinin qaydaları icazə verilir.
İndi biz orta dəyəri saxlamaq üçün istifadə olunacaq lokal dəyişən elan etməliyik.Eqo bəyannaməsi belə görünəcək:

DƏYƏNƏN avg_qiyməti DOUBLE Dəqiqliyi ELAN EDİN;

İndi isə keçək saxlanılan prosedurun gövdəsinə CP-nin gövdəsini açaq açar söz BAŞLAYIN.
Birincisi, alqoritmimizin ilk addımını yerinə yetirməliyik - orta qiyməti hesablamaq. Bunun üçün aşağıdakı sorğudan istifadə edəcəyik:

AVG SEÇİN(qiymət_l)
Cədvəldən_Nümunə
INTO:orta_qiymət,-

Bu sorğu istifadə edir məcmu funksiya Seçilmiş sorğu sətirləri arasında PRICE_1 sahəsinin orta dəyərini qaytaran AVG - bizim vəziyyətimizdə bütün Cədvəl_misal cədvəli üzrə PRICE_1 orta dəyəri. Sorğunun qaytardığı dəyər avg_price dəyişəninə yerləşdirilir. Qeyd edək ki, avg_pnce dəyişəninin qarşısında iki nöqtə qoyulur - onu sorğuda istifadə olunan sahələrdən fərqləndirmək üçün.
Bu sorğunun xüsusiyyəti ondan ibarətdir ki, o, həmişə tam olaraq bir və yeganə qeydi qaytarır. Belə sorğulara təkton sorğular deyilir.Və saxlanılan prosedurlarda yalnız belə seçimlərdən istifadə oluna bilər. Əgər sorğu birdən çox cərgə qaytarırsa, o zaman o, hər bir qaytarılmış cərgəni emal etmək üçün döngə təşkil edən FOR SELECT...DO konstruksiyası kimi formatlaşdırılmalıdır.
Beləliklə, qiymətin orta dəyərini aldıq. İndi bütün cədvəli nəzərdən keçirməli, hər bir qeyddəki qiymət dəyərini orta qiymətlə müqayisə etməli və müvafiq tədbirlər görməlisiniz.
Əvvəldən biz Table_example cədvəlindən hər bir qeydin iterasiyasını təşkil edirik

ÜÇÜN
SEÇİM ID, NAME, PRICE_1
Cədvəldən_Nümunə
INTO:ID, :NAME, :new_price
EDİN
BAŞLAYIN
/*_burada hər rekordu genişləndiririk*/
SON

Bu konstruksiya yerinə yetirildikdə, məlumatlar Cədvəl_misal cədvəlindən sətir-sətir götürüləcək və hər sətirdəki sahə dəyərləri ID, NAME və new_pnce dəyişənlərinə təyin ediləcək. Əlbəttə ki, bu dəyişənlərin çıxış parametrləri kimi elan edildiyini xatırlayırsınız, lakin seçilmiş məlumatların nəticə kimi qaytarılacağından narahat olmamalısınız: çıxış parametrlərinə bir şey təyin edilməsi o demək deyil ki, HP-yə zəng edən müştəri dərhal məlumat alacaq. bu dəyərlər.! Parametrlər yalnız SUSPEND əmri yerinə yetirildikdə ötürülür və bundan əvvəl biz çıxış parametrlərini normal dəyişənlər kimi istifadə edə bilərik - nümunəmizdə bunu new_price parametri ilə edirik.
Beləliklə, BEGIN.. .END döngəsinin gövdəsi daxilində biz hər bir sıranın dəyərlərini emal edə bilərik. Xatırladığınız kimi, mövcud qiymətin orta qiymətlə necə müqayisə olunduğunu öyrənməli və müvafiq tədbirlər görməliyik. Bu müqayisə prosedurunu IF ifadəsindən istifadə edərək həyata keçiririk:

ƏGƏR (yeni_qiymət > orta_qiymət) SONRA /*cari qiymət orta qiymətdən böyükdürsə*/
BAŞLAYIN
/*sonra orta qiymətə və sabit faizə bərabər yeni qiymət təyin edin */
yeni_qiymət = (orta_qiymət + orta_qiymət*(Percent2Artım/100));
Cədvəl_nümunəsini YENİLƏNİN
QİYMƏT_1 SET = :yeni_qiymət
HARA ID = :ID;
SON
BAŞQA
BAŞLAYIN
/* Əgər cari qiymət orta qiymətdən azdırsa və ya ona bərabərdirsə, qiyməti əvvəlki qiymətə üstəgəl köhnə və orta qiymət arasındakı fərqin yarısına bərabər təyin edin */
yeni_qiymət = (new_pnce + ((avg_pnce new_price)/2)) ;
Cədvəl_nümunəsini YENİLƏNİN
QİYMƏT_1 SET = :yeni_qiymət
HARA ID = .ID;
SON

Gördüyünüz kimi, kifayət qədər böyük IF konstruksiyası əldə etdik, əgər bunu /**/ simvollarına əlavə edilmiş şərhlər olmasaydı, başa düşmək çətin olardı.
Qiyməti hesablanmış fərqə uyğun olaraq dəyişdirmək üçün biz mövcud qeydləri - bir və ya daha çoxunu dəyişdirməyə imkan verən UPDATE bəyanatından istifadə edəcəyik. Qiymətin hansı qeyddə dəyişdirilməli olduğunu birmənalı şəkildə göstərmək üçün biz WHERE bəndində əsas açar sahəsindən istifadə edirik, onu cari qeyd üçün ID dəyərini saxlayan dəyişənin dəyəri ilə müqayisə edirik: ID=:ID. Qeyd edək ki, ID dəyişəninin qarşısında iki nöqtə qoyulur.
IF...THEN...ELSE konstruksiyasını yerinə yetirdikdən sonra ID, NAME və new_price dəyişənləri proseduru çağıran müştəriyə qaytarmalı olduğumuz məlumatları ehtiva edir. Bunu etmək üçün, IF-dən sonra, məlumatları HP-nin çağırıldığı yerə göndərəcək SUSPEND əmrini daxil etməlisiniz.Köçürmə zamanı prosedur dayandırılacaq və HP-dən tələb olunduqda. yeni giriş, sonra yenidən davam etdiriləcək - və beləliklə, FOR SELECT...DO sorğusunun bütün qeydlərini keçirənə qədər davam edəcək.
Qeyd etmək lazımdır ki, yalnız saxlanılan proseduru dayandıran SUSPEND əmrindən əlavə, sətir ötürüldükdən sonra saxlanılan proseduru dayandıran EXIT əmri də mövcuddur. Bununla belə, EXIT əmri nadir hallarda istifadə olunur, çünki o, əsasən müəyyən bir vəziyyətə çatdıqda döngəni qırmaq üçün lazımdır.
Bu halda, prosedur SELECT ifadəsi ilə çağırıldıqda və EXIT ilə dayandırıldıqda, sonuncu əldə edilmiş sıra geri qaytarılmayacaq. Yəni proseduru dayandırmaq və hələ də> bu xətti almaq lazımdırsa, ardıcıllıqla istifadə etməlisiniz

dayandırmaq;
ÇIXIŞ;

EXIT-in əsas məqsədi təkton məlumat dəstlərini əldə etmək, EXECUTE PROCEDURE vasitəsilə zəng edərək parametrləri qaytarmaqdır. Bu halda, çıxış parametrlərinin dəyərləri təyin edilir, lakin onlardan SQL verilənlər toplusu formalaşmır və prosedur başa çatır.
Saxlanılan prosedurumuzun mətnini tam şəkildə yazaq ki, bir baxışda onun məntiqini tuta bilək:

PROSEDUR YARADIN Qiymətləri Artırın(
Faiz2İkiqat Dəqiqliyi Artırın)
QAYTARIR (ID BÜTÜN, VARCHAR ADI(80),
yeni_qiymət İKİ DƏqiqlik) KİMİ
DƏYƏNƏN avg_qiyməti DOUBLE Dəqiqliyi ELAN EDİN;
BAŞLAYIN
AVG SEÇİN(qiymət_l)
Cədvəldən_Nümunə
INTO:orta_qiymət;
ÜÇÜN
SEÇİM ID, NAME, PRICE_1
Cədvəldən_Nümunə
INTO:ID, :NAME, :new_price
EDİN
BAŞLAYIN
/*hər qeydi burada emal edirik*/
ƏGƏR (new_pnce > avg_price) SONRA /*cari qiymət orta qiymətdən böyükdürsə*/
BAŞLAYIN
/*orta qiymətə və sabit faizə bərabər yeni qiymət təyin edin */
yeni_qiymət = (orta_qiymət + orta_qiymət*(Percent2Artım/100));
Cədvəl_nümunəsini YENİLƏNİN
QİYMƏT_1 SET = :yeni_qiymət
HARA ID = :ID;
SON
BAŞQA
BAŞLAYIN
/* Əgər cari qiymət orta qiymətdən azdırsa və ya ona bərabərdirsə, o zaman qiyməti əvvəlki qiymətə üstəgəl köhnə və orta qiymət arasındakı fərqin yarısına bərabər qoyur */
yeni_qiymət = (yeni_qiymət + ((orta_qiymət - yeni_qiymət)/2));
Cədvəl_nümunəsini YENİLƏNİN
QİYMƏT_1 SET = :yeni_qiymət
HARA ID = :ID;
SON
dayandırmaq;
SON
SON

Bu saxlanılan prosedur nümunəsi əsas saxlanılan prosedurun və tetik dili konstruksiyalarının istifadəsini göstərir. Sonra, bəzi ümumi problemləri həll etmək üçün saxlanılan prosedurlardan istifadə yollarına baxacağıq.

Rekursiv Saxlanılan Prosedurlar

InterBase saxlanan prosedurları rekursiv ola bilər. Bu o deməkdir ki, saxlanılan prosedur özünü çağıra bilər. Saxlanılan prosedurların 1000-ə qədər yuva səviyyəsinə icazə verilir, lakin yadda saxlamaq lazımdır ki, serverdəki pulsuz resurslar maksimum HP yuvasına çatana qədər tükənə bilər.
Saxlanılan prosedurlar üçün ümumi istifadələrdən biri verilənlər bazasında saxlanılan ağac strukturlarını emal etməkdir. Ağaclar tez-tez BOM, anbar, HR və digər ümumi tətbiqlərdə istifadə olunur.
Müəyyən bir yuva səviyyəsindən başlayaraq müəyyən bir növün bütün məhsullarını seçən saxlanılan prosedur nümunəsinə baxaq.
Problemin aşağıdakı ifadəsini edək: bizdə bu tip iyerarxik quruluşa malik mallar kataloqu var:

Mallar
- Məişət texnikası
- Soyuducular
- Üç kameralı
- İki kameralı
- Tək kameralı
- Paltaryuyan maşınlar
- Şaquli
- Frontal
- Klassik
- Dar
- Kompüter texnologiyası
....

Məhsul kateqoriyaları kataloqunun bu strukturu müxtəlif dərinlikdə filiallara malik ola bilər. həm də zamanla artır. Bizim vəzifəmiz istənilən qovşaqdan başlayaraq "tam adın açılması" ilə kataloqdan bütün sonlu elementlərin seçimini təmin etməkdir. Məsələn, "Paltaryuyan maşınlar" qovşağını seçsək, aşağıdakı kateqoriyaları almalıyıq:

Paltaryuyan maşınlar - Şaquli
Paltaryuyan maşınlar - Frontal Classic
Paltaryuyan maşınlar - Frontal Dar

Məhsul kataloqunda məlumatların saxlanması üçün cədvəllərin strukturunu müəyyən edək. Bir cədvəldə bir ağacı təşkil etmək üçün sadələşdirilmiş bir sxemdən istifadə edirik:

CƏDVƏL YARADIN GoodsTree
(ID_GOOD TAM NULL DEYİL,
ID_PARENT_GOOD INTEGER,
GOOD_NAME VARCHAR(80),
məhdudiyyət pkGooci əsas açarı(ID_GOOD));

Biz yalnız 3 sahəyə malik olan bir GoodsTree cədvəli yaradırıq: ID_GOOD - ağıllı kateqoriya identifikatoru, ID_PARENT_GOOD - bu kateqoriya üçün kateqoriya ana ağacının identifikatoru və GOOD_NAME - kateqoriyanın adı. Bu cədvəldəki məlumatların bütövlüyünü təmin etmək üçün bu cədvələ xarici açar məhdudiyyəti tətbiq edəcəyik:

CƏDVƏL DEĞİŞTİRİN GoodsTree
MƏHDUD FK_goodstree ƏLAVƏ EDİN
XARİCİ AÇAR (ID_PARENT_GOOD)
REFERANSLAR GOODSTPEE (ID_GOOD)

Cədvəl özünə istinad edir və verilən xarici açar bunu izləyir. belə ki, cədvəldə mövcud olmayan valideynlərə istinadlar olmasın və həmçinin uşaqları olan məhsul kateqoriyalarını silmək cəhdlərinin qarşısını alır.
Aşağıdakı məlumatları cədvəlimizə daxil edək:

ID_GOOD

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

YAXŞI AD

MALLAR
Məişət texnikası
Kompüterlər və aksesuarlar
Soyuducular
Paltaryuyan maşınlar
Üç kameralı
İki kameralı
Tək kameralı
şaquli
Frontal
Dar
Klassik

İndi məlumatları saxlamaq üçün yerimiz olduğundan, bütün "son" məhsul kateqoriyalarını "genişlənmiş" formada göstərən saxlanılan prosedur yaratmağa başlaya bilərik - məsələn, "Üç kameralı" kateqoriyası üçün tam adı kateqoriya "Məişət texnikası Üç kameralı soyuducu" kimi görünəcək.
Ağac strukturlarını emal edən saxlanılan prosedurlar öz terminologiyasını inkişaf etdirmişdir. Ağacın hər bir elementi düyün adlanır; və bir-birinə istinad edən qovşaqlar arasındakı əlaqəyə valideyn-övlad münasibəti deyilir. Ağacın ən sonunda olan və uşağı olmayan düyünlərə "yarpaqlar" deyilir.
Saxlanılan prosedurumuzda giriş kimi kateqoriya ID-si olacaq, ondan aşağı qazmağa başlamalıyıq. Saxlanılan prosedur belə görünəcək:

GETFULLNAME PROSEDURUNU YARADIN (ID_GOOD2 GÖSTER İNTEGER)
GERİ DÖNÜŞLƏR (FULL_GOODS_NAME VARCHAR(1000),
ID_CHILD_GOOD BÜTÜN)
AS
DƏYƏNƏN CURR_CHILD_NAME VARCHAR(80);
BAŞLAYIN
/*0xarici təşkil edir FOR döngəsi ID_GOOD=ID_GOOD2SHOW */ ilə məhsulun birbaşa nəslini SEÇİN
SEÇİM ÜÇÜN gtl.id_good, gtl.good_name
GoodsTree gtl
HARA gtl.id_parent_good=:ID_good2show
INTO:ID_CHILD_GOOD, :full_goods_name
EDİN
BAŞLAYIN
/"Mötərizədə olan sorğu ən azı bir sətir qaytararsa, DOĞRU qaytaran EXISTS funksiyası ilə yoxlayın. Əgər ID_PARENT_GOOD = ID_CHILD_GOOD ilə tapılmış qovşağın uşağı yoxdursa, o, ağacın "yarpağıdır" və nəticələrə daxil olur * /
ƏGƏR (VAR YOXDUR(
GoodsTree-DƏN * SEÇİN
HARADA GoodsTree.id_parent_good=:id_child_yaxşı))
SONRA
BAŞLAYIN
/* Ağacın “yarpağını” nəticələrə keçirin */
dayandırmaq;
SON
BAŞQA
/* Uşaqları olan qovşaqlar üçün */
BAŞLAYIN
/*ana qovşağın adını müvəqqəti dəyişəndə ​​saxla */
CURR_CHILD_NAME=tam_malların_adı;
/* bu proseduru rekursiv şəkildə icra edin */
ÜÇÜN
ID_CHILD_GOOD,tam_mal_adı SEÇİN
GETFULLNAMEDƏN(:ID_CHILD_GOOD)
INTO:ID_CHILD_GOOD, :full_goods_name
BAŞLAYIN
/*tapılana ana qovşağın adını əlavə edin., sətir birləşmə əməliyyatından istifadə edərək uşaq adı || */
full_goods_name=CURR_CHILD_NAME| " " | f ull_mal_name,-
dayandırmaq; /* məhsulun tam adını qaytarın */
SON
SON
SON
SON

Bu proseduru ID_GOOD2SHOW= 1 giriş parametri ilə icra etsək, aşağıdakıları əldə edirik:

Gördüyünüz kimi, rekursiv saxlanılan prosedurun köməyi ilə biz bütün kateqoriya ağacını gəzdik və budaqların ən ucunda olan "yarpaq" kateqoriyalarının tam adını çıxardıq.

Nəticə

Bu, saxlanılan prosedur dilinin əsas xüsusiyyətlərinə baxışımızı yekunlaşdırır. Aydındır ki, bir fəsildə saxlanılan prosedurların işlənməsini tam mənimsəmək mümkün deyil, lakin burada biz saxlanılan prosedurlarla bağlı əsas anlayışları təqdim etməyə və izah etməyə çalışdıq. HP-nin təsvir edilən dizaynları və dizayn üsulları əksər verilənlər bazası proqramlarında tətbiq oluna bilər.
Saxlanılan prosedurların inkişafı ilə bağlı bəzi mühüm məsələlər növbəti fəsildə - "InterBase saxlanılan prosedur dilinin genişləndirilmiş xüsusiyyətləri"ndə əhatə olunacaq, o, istisnaların idarə edilməsinə, saxlanılan prosedurlarda xətaların idarə edilməsinə və massivlərlə işləməyə həsr edilmişdir.

Mən saxlanılan prosedurlardan nə vaxt istifadə etməliyəm və SQL Serverdə baxışlardan nə vaxt istifadə etməliyəm?

İcazələr dinamik sorğular yaratmağa imkan verir, parametrləri hara ötürə bilərik?

Hansı ən sürətlidir və hansı əsasda digərindən daha sürətlidir?

Baxışlar və ya saxlanılan prosedurlar yaddaşı həmişəlik saxlayır?

Kimsə baxışların virtual cədvəli, prosedurların isə materiallar cədvəlini yaratdığını deyirsə, bu nə deməkdir?

Zəhmət olmasa mənə əlavə məqamlar haqqında məlumat verin.

"Saxlanılan prosedur və görünüş arasındakı fərq nədir?"

Görünüşdür virtual masa. Siz bir görünüşdə birdən çox cədvəli birləşdirə və verilənləri bir cədvəldən gələn kimi təqdim etmək üçün görünüşdən istifadə edə bilərsiniz.

Saxlanılan prosedur bir funksiyanı yerinə yetirmək üçün parametrlərdən istifadə edir ... məlumatların yenilənməsi və daxil edilməsi və ya fərdi dəyərlərin və ya məlumat dəstlərinin qaytarılmasından asılı olmayaraq.

Baxışların və Saxlanılan Prosedurların yaradılması - Onları nə vaxt və nə üçün istifadə etmək barədə Microsoft-dan bəzi məlumatları ehtiva edir.

Tutaq ki, mənim iki cədvəlim var:

tbl_user Sütunları: .user_id, .user_name, .user_pw

tbl_profile Sütunlar: .profile_id, .user_id .profile_description

Belə ki, əgər mən bu cədvəllərdən çoxlu sorğuda olsam... HƏR peice sql-də qoşulmaq əvəzinə mən belə bir görünüş təyin edərdim:

Vw_user_profile AS Görünüşü YARAT tbl_user-DƏN A.user_id, B.profile_description seçin A.user_id = b.user_id GO-da sol birləşən tbl_profile B B.

Beləliklə, gələcəkdə istifadəçi id-si ilə profile_təsvirini sorğulamaq istəsəm... etməli olduğum tək şey budur

user_id = @ID Vw_user_profile FROM profil_təsvirini SEÇİN

Bu kod saxlanılan prosedurda belə istifadə edilə bilər:

dbo.getDesc @ID int proseduru yaradın AS başlasın profile_description SEÇİN vw_user_profile FROM user_id = @ID END GEÇ

Ona görə də sonra zəng edə bilərəm

Dbo.getDesc 25

və istifadəçi id 25 üçün təsviri əldə edəcəm, burada 25 sizin parametrinizdir.

Aydındır ki, daha çox şey var, amma bu, yalnız əsas fikirdir.

Əvvəlcə hər ikisinin fərqli şeylər olduğunu başa düşməlisiniz. Saxlanılan prosedurlar INSERT-UPDATE-DELETE ifadələri üçün ən yaxşı şəkildə istifadə olunur. və Görünüşlər SELECT ifadələri üçün istifadə olunur. və hər ikisindən istifadə etməlisiniz.

Görünüşlərdə siz məlumatları dəyişə bilməzsiniz.

Baxışlar: Bu, müxtəlif real verilənlər bazası cədvəllərindən bir və ya bir neçə sətir və sütundan ibarət virtual cədvəldir. Bu, bir neçə cədvəlin sətir və sütunlarından ibarət şablondur. Burada heç bir parametr ötürə bilməzsiniz.

Saxlanılan Prosedurlar: Onlar parametrləri giriş kimi göndərə və çıxışı qəbul edə biləcəyiniz əvvəlcədən icra edilmiş SQL ifadələri toplusudur.

Görünüşlər Saxlanan Prosedurda istifadə edilə bilər, lakin Saxlanan Prosedur Görünüşlərdə istifadə edilə bilməz...!

Saxlama proseduru zaman istifadə olunur sadə SQL sadəcə kifayət deyil. Saxlama prosedurları dəyişənləri, döngələri və digər saxlanılan prosedurlara zəngləri ehtiva edir. Bu, sorğu dili deyil, proqramlaşdırma dilidir.

    Baxışlar statikdir. Onları xüsusi tərtibata malik yeni cədvəllər kimi düşünün və onlardakı məlumatlar sizin yaratdığınız sorğudan istifadə edərək tez yaradılır. İstənilən SQL cədvəlində olduğu kimi siz onu WHERE , GROUP BY və ORDER BY ilə çeşidləyə və filtrləyə bilərsiniz.

    Bu, nə etdiyinizdən asılıdır.

    Bu verilənlər bazasından asılıdır. Sadə Baxışlar sadəcə sorğunu yerinə yetirin və nəticəni süzün. Lakin Oracle kimi verilənlər bazaları sizə "materiallaşdırılmış" görünüş yaratmağa imkan verir ki, bu da əsasən görünüşün əsas məlumatları dəyişdikdə avtomatik olaraq yenilənən cədvəldir.

    Materiallaşdırılmış görünüş sizə görünüş sütunlarında indekslər yaratmağa imkan verir (xüsusilə verilənlər bazasında heç bir yerdə olmayan hesablanmış sütunlarda).

    Nə danışdığınızı başa düşmürəm.

Əsas fərq ondan ibarətdir ki, siz görünüş tələb etdiyiniz zaman həmin tərif sorğunuza daxil edilir. Prosedura sorğu nəticələri də verə bilər, lakin o, çox tez tərtib olunur. Başqa bir seçim indeksləşdirilmiş görünüşlərdir.

SQL View SQL SELECT sorğusuna əsaslanan virtual cədvəldir. Görünüş bir və ya bir neçə mövcud verilənlər bazası cədvəlinə və ya digər görünüşlərə aiddir. Bu verilənlər bazası şəklidir, saxlanılan prosedur isə vahid icra planına yığılmış Transact-SQL ifadələri qrupudur.

Görünüş verilənlər bazası cədvəllərində saxlanılan məlumatların sadə nümayişidir, saxlanılan prosedur isə icra oluna bilən ifadələr qrupudur.

Görünüş daha sürətli olur, çünki o, istinad etdiyi cədvəllərdən məlumatları göstərir, mağaza proseduru isə sql ifadələrini yerinə yetirir.

Bu məqaləyə baxın: Baxış və Saxlanan Prosedurlar. Tam olaraq axtardığınız şey

@Patrick dediklərinə uyğundur, lakin digər suallarınıza cavab vermək üçün Görünüş yaddaşda özünü yaradacaq və Qoşulmaların, Məlumatların növündən asılı olaraq və hər hansı bir toplama aparılarsa, bu, kifayət qədər ac View ola bilər.

Saxlanılan prosedurlar bütün emallarını ya #tmpTable1 kimi Temp Hash Cədvəli ilə, ya da @tmpTable1 istifadə edərək yaddaşda həyata keçirir. Nə demək istədiyinizdən asılı olaraq.

Saxlanılan prosedur funksiyaya bənzəyir, lakin onun birbaşa adı ilə çağırılır. sorğunun özündə əslində istifadə olunan funksiyalar yerinə.

Aydındır ki, çoxlu məlumat almadığınız halda vaxt yaddaşı cədvəllərinin əksəriyyəti daha sürətli olur.

Görünüşdəki məlumatları dəyişdirə bilməyəcəyinizi təklif edəndə Mahesh tamamilə doğru deyil. Beləliklə, Patrikin nöqteyi-nəzərindən

Vw_user_profile AS Görünüşü YARAT tbl_user FROM A.user_id, B.profile_description seçin A.user_id = b.user_id-də tbl_profile B-dən sola qoşulun

Mən məlumatları yeniləyə bilərəm... nümunə olaraq bunlardan hər hansı birini edə bilərəm...

vw_user_profile güncəlləyin profile_description="Menecer" seçin, burada user_id=4

tbl_profile yeniləməsini təyin edin profile_description="Menecer" burada user_id=4

Siz bu görünüşə INSERT edə bilməzsiniz, çünki bütün cədvəldəki bütün sahələr mövcud deyil və mən hesab edirəm ki, PROFILE_ID əsas açardır və NULL ola bilməz. Bununla belə, bəzən görünüşə INSERT daxil etmək istəyə bilərsiniz...

Mövcud cədvəl üçün görünüş yaratdım...

SEÇ * kimi Görünüş Önəmsizliyini yaradın

Lazımsız dəyərlərə (kod, ad) daxil edin ("glyn","Glyn Roberts"), ("Mary","Maryann Roberts")

ID>4

Bu halda həm INSERT, həm də DELETE işlədi

Aydındır ki, siz cəmlənmiş və ya hesablanmış heç bir sahəni yeniləyə bilməzsiniz, lakin sadəcə birbaşa görünüş olan hər hansı bir görünüş yenilənə bilməlidir.

Görünüşdə birdən çox cədvəl varsa, siz daxil edə və ya silə bilməzsiniz, lakin görünüş bir cədvəlin alt çoxluğudursa, adətən edə bilərsiniz.

Yuxarıdakı şərhlərə əlavə olaraq, Baxışlar haqqında bir neçə qeyd əlavə etmək istərdim.

  1. Görünüşlər mürəkkəbliyi gizlətmək üçün istifadə edilə bilər. 5 nəfərin bir layihə üzərində işlədiyi bir ssenari təsəvvür edin, lakin onlardan yalnız biri kompleks birləşmələr kimi verilənlər bazası ilə çox yaxşıdır. Belə bir ssenaridə o, hər hansı bir cədvəl tələb etdikləri üçün digər komanda üzvləri tərəfindən asanlıqla tələb oluna biləcək görünüşlər yarada bilər.
  2. Təhlükəsizlik Views tərəfindən asanlıqla həyata keçirilə bilər. Tutaq ki, biz işçi kimi həssas sütunları ehtiva edən cədvəl Maaş , SSN nömrəsi. Bu sütunlar onlara baxmaq səlahiyyəti olmayan istifadəçilərə göstərilməməlidir. Bu halda cədvəldə avtorizasiya tələb etməyən sütunları seçəcək görünüş yarada bilərik, məsələn ad , yaş və həssas sütunları ifşa etmədən və s (əvvəllər qeyd etdiyimiz maaş və s.). İndi cədvəli birbaşa sorğulamaq üçün icazəni silə bilərik işçi və sadəcə görünüşdə oxumaq icazəsini qeyd edin. Beləliklə, biz Views ilə təhlükəsizliyi həyata keçirə bilərik.

Biznes məntiqini və ya onun bir hissəsini həyata keçirmək üçün saxlanılan DBMS funksiyalarından istifadə həmişə büdrəmə olub. Bir tərəfdən DBA barrikadaları və verilənlər bazası proqramçıları, digər tərəfdən isə backend tərtibatçıları.
Hər iki düşərgənin qəzəbinə tuş gəlmək riski ilə mən yenə də müsbət və mənfi cəhətləri ümumiləşdirəcəyəm və saxlanılan funksiyalarda kodun nə vaxt yazılması və onu nə vaxt çıxarmaq barədə fikirlərimi açıqlayacağam.

Qarşı arqumentlərlə başlayaq:

Biznes məntiqini ləkələmək

Bu, əslində bir vasitə kimi DBMS və HF problemi deyil - bu, onların sui-istifadə problemidir. Verilənlər bazası proqramçısı, saxlanılan funksiyada həyata keçirilən hərəkətin bütün məntiqini təsvir etmək istəyə bilər - həqiqətən də, bütün məlumatlar burada, əlindədir. Proqramçı sınağa tab gətirsə və meneceri etiraz etməsə, gələcəkdə xarici sistemlə (məsələn, proqram serveri ilə) interfeysin darlığı ilə bağlı problemlər yarana bilər - yeni parametrlər əlavə etməli, mürəkkəbləşdirməli olacaqsınız. məntiq və s. Bu, hətta bir qədər fərqli funksionallığı olan “dublikat” HF-lərin yaranmasına səbəb ola bilər.

DBMS dilinin azlığı

Belə bir şey var. HF pl/sql, t-sql, pl/pgsql yazmaq üçün ənənəvi dillər ilə müqayisədə olduqca primitivdir. müasir dillərümumi məqsəd. Qeyd etmək lazımdır ki, HF-i daha inkişaf etmiş dillərdə, məsələn, Oracle-da Java və ya postgresql-də Python-da yazmaq mümkündür.

Saxlanmış funksiyaya qarşı dözümsüzlük

Bu, müxtəlif DBMS-lərin prosedur dillərinin dialektlərinin uyğunsuzluğuna aiddir. Multiplatform düzgündür - DBMS-nin özündə müxtəlif əməliyyat sistemləri və arxitekturaların dəstəyi və daxili dillərin xarici platformadan müstəqilliyi sayəsində. Burada yenə də qərar layihənin xüsusiyyətlərindən asılıdır. Əgər layihə təkrarlana bilirsə və siz platformaya nəzarət etmirsinizsə (klassik nümunə CMS-dir), o zaman sizə daşınma qabiliyyəti lazımdır və HF-dən istifadə yalnız baş ağrısı əlavə edəcək. Layihə unikaldırsa və ya tətbiqlər vahid olacaqsa (məsələn, eyni şirkətin müxtəlif filiallarında), onda müxtəlif DBMS arasında dözümsüzlüyü unuda bilərsiniz.

Komandanın lazımi bacarıqlarının olmaması və müvafiq mütəxəssislərin yüksək "qiyməti"

Bu, mənim fikrimcə, HF-nin istifadəsinə qarşı ən ciddi arqumentdir. Hamısı layihənin miqyasından asılıdır. Kobud desək, DBMS tərəfində saxlanılan kodun istifadəsi orta iri müəssisə layihələrində özünü doğruldur. Layihə daha kiçikdirsə - oyun şama dəyər deyil. Layihə nəhəng və həddindən artıq yüklənmişdirsə, HF və RDBMS ilə arxitektura miqyasda problemlərlə üzləşəcək - burada məlumatların işlənməsi üçün xüsusi bir saxlama və yanaşmadan istifadə etmək lazımdır.

İndi müsbətlər:

Sürət

Xarici proqramda hətta kiçik həcmli məlumatları emal edərkən, biz şəbəkə üzərindən ötürülməyə və verilənləri lazım olan formata çevirməyə əlavə vaxt sərf edirik. Bundan əlavə, optimala yaxın olan məlumatların işlənməsi alqoritmləri artıq DBMS-də qurulmuş, sazlanmış və sınaqdan keçirilmişdir, ona görə də proqramçılarınız təkəri yenidən ixtira etmək təcrübəsinə ehtiyac duymurlar.

Məlumat strukturunun gizlədilməsi

Böyümə və təkamüllə proqram təminatı sistemi məlumat sxemi dəyişə bilər və dəyişməlidir. Yaxşı dizayn edilmiş HF API kodu dəyişdirmədən məlumat sxemini dəyişdirməyə imkan verəcəkdir. xarici tətbiqlər(onlardan bir neçəsi ola bilər). Bu, üzvi olaraq verilənlər bazası ilə işləyən və onun strukturunu bilən tərtibatçıların və yalnız təqdim edilmiş API-ni bilməli olan xarici proqram tərtibatçılarının rollarının ayrılması ilə nəticələnir. Tətbiq tərəfində dinamik SQL-dən istifadə edərkən belə bir ayırma üçün verilənlər bazası proqram təminatı abstraksiyalarının əlavə təbəqələri, müxtəlif ORM-lər təqdim edilir.

Çevik giriş hüquqlarının idarə edilməsi

Yaxşı təcrübə, müştəri tətbiqinin verilənlər bazasına "gedəcəyi" istifadəçini elə məhdudlaşdırmaqdır ki, o, hər hansı obyektləri oxumaq və dəyişdirmək hüququna malik olmayacaq. O, yalnız ona təyin edilmiş funksiyaları yerinə yetirir. Beləliklə, siz müştəri üçün hansı hərəkətlərin mövcud olduğuna ciddi şəkildə nəzarət edə bilərsiniz və müştəri tətbiqindəki səhv səbəbindən məlumatların bütövlüyünün pozulması ehtimalı azalır.

SQL inyeksiya şansı daha azdır

Müştəri proqramı tərəfindən dinamik SQL-dən istifadə edərkən, müştəri proqramı kodda əvvəlcədən qurulmuş sətirlər şəklində SQL DBMS-ə əmrlər göndərir. Bu sətirləri formalaşdırarkən proqramçı son dərəcə diqqətli olmalıdır ki, SQL əmrinin gözlənilmədən dəyişdirilməsi ehtimalına yol verməsin. SQL HF-dən istifadə edərkən, proqram tərəfindəki kod adətən statik olur və parametrləri sətirlərdə deyil, bağlama mexanizmi vasitəsilə yer tutanlar (: dəyişən) vasitəsilə ötürülən sadə HF çağırışına bənzəyir. Əlbəttə ki, bu, SQL inyeksiyasının mümkünlüyünü tamamilə istisna etmir (hər şeydən sonra, HF-də dinamik şəkildə yerinə yetirilən SQL sorğusunun mətni ilə parametr kimi ötürülən sətri birləşdirə bilərsiniz), lakin onun ehtimalını əhəmiyyətli dərəcədə azaldır.

SQL-in təkrar istifadəsi

Saxlanılan təbəqədə verilənlərlə işləmək məntiqini tətbiq etməklə biz təkrarlanan iyerarxik model əldə edirik. SQL istifadə edərək kod.
Dinamik SQL istifadə edərkən sorğunun təkrar istifadəsi çətindir.
Məsələn, HF-ə əsaslanan A sistemi və dinamik SQL-ə əsaslanan B sistemi olsun. Hər iki sistem məhsulun get_price qiymətini əldə etmək funksiyasına malikdir. A halda, bu saxlanılan funksiya və ya displeydir (görünüş), B halda, məsələn, JDBC vasitəsilə SQL sorğusunu yerinə yetirən java proseduru. Bir vəzifə var - anbarda malların ümumi dəyərini almaq. A vəziyyətində biz get_price-i birbaşa anbarda olan malların siyahısını alan sorğuya birləşdiririk (əgər get_price PostgreSQL-də olduğu kimi SQL-də görünüş və ya HF olarsa, optimallaşdırıcı sorğunu inline genişləndirir - beləliklə, bir sorğu əldə edilir. cəmini tez tapır).
B vəziyyətində iki seçim var - ya anbarda mal seçimi ilə kursorun üzərindən keçin və get_price-ə n dəfə zəng edin (bu o deməkdir ki, bütün seçim şəbəkə üzərindən müştəriyə ötürülməlidir) və ya təkrar istifadə etməyi unudub yazın. get_price-də artıq yazılmış olanı təkrarlayan alt sorğu. Hər iki variant pisdir.

Sadə SQL Sazlama

Daha asan sazlama (heterojen xarici kod + sql proseduru ilə müqayisədə)
Dinamik SQL (hər hansı ORM) olan sistemlərdə problemli SQL parçasını tapmaq kimi sadə tapşırıq belə çətin ola bilər.
Kompilyasiya zamanı semantik və sintaktik SQL yoxlanışı.
Funksiyaları profilləşdirmək və darboğazları tapmaq bacarığı.
Artıq işləyən və işləyən sistemi izləmək imkanı.
Asılılıqların avtomatik idarə edilməsi - obyektin tərifini dəyişdirərkən, asılı subyektlər etibarsız sayılır.

Verilənlər bazasında biznes məntiqi nə vaxt yazılmalıdır?

Emal sürəti vacib olduqda
Məlumatların bilavasitə saxlandığı yerdə emalı çox vaxt emal sürətində əhəmiyyətli artım verir. Bu cür optimallaşdırmalar, məsələn, məlumat anbarı səviyyəsində aqreqasiya kimi mümkün olur - massivdən verilənlər hətta müştərini deməmək şərti ilə DBMS serverinə ötürülmür.
Məlumatların bütövlüyü və ardıcıllığı vacib olduqda
Açıq əməliyyat və kilid idarəetməsi ilə saxlanılan funksiyalar məlumatların bütövlüyünü və əməliyyatların atomikliyini təmin etməyi asanlaşdırır. Təbii ki, bütün bunları kənardan həyata keçirmək olar, lakin bu, ayrı və böyük işdir.
Məlumat mürəkkəb, lakin yaxşı qurulmuş bir quruluşa malikdir
Düz və boş birləşdirilmiş strukturlar çox vaxt DBMS-nin təklif etdiyi emal alətlərinin tam zənginliyini tələb etmir. Onlar üçün siz ultra sürətli açar-dəyər mağazalarından və yaddaşdaxili keşləmədən istifadə edə bilərsiniz.
Mürəkkəb şəkildə təşkil edilmiş, yüksək dərəcədə əlaqəli iyerarxik və şəbəkə strukturları RDBMS biliklərinizin faydalı olacağının aydın göstəricisidir!

Kodu nə vaxt çıxarmaq lazımdır?

Xarici məlumatlarla işləmək
Sistemin xüsusiyyətləri elədirsə ki, emal üçün kənardan (sensorlardan, digər sistemlərdən) verilənlər bazasında saxlanılan məlumatlardan daha çox məlumat gəlir, onda proqramlaşdırma platforması kimi verilənlər bazasının bir çox üstünlükləri itirilir. Məlum olub ki, xaricdən daxil olan məlumatları emal etmək və nəticəni verilənlər bazasında saxlamaq hər şeyi əvvəlcə verilənlər bazasına sıxıb sonra emal etməkdən daha asandır. Eyni prinsip burada da müşahidə olunur - verilənlər bazasında artıq saxlanılan məlumatların emalı ilə bağlı yuxarıda danışdığımız mənbəyə mümkün qədər yaxın məlumatları emal etmək.
Kompleks alqoritmlər
Mürəkkəb və ya yüksək optimallaşdırılmış ədədi əzmə alqoritmləri ən yaxşı bunun üçün daha uyğun olan dillərdə yazılır. Quraşdırılmış RDBMS dilləri çox güclüdür (yüksək səviyyəli, çevik deyil), lakin buna görə yüksək yükə malikdirlər.
Yüksək yükləmə
Ultra yüksək yüklü sistemlərdə tranzaksiyaların seriallaşdırılması və klaster serverlərinin sinxronlaşdırılması üçün ənənəvi yanaşmalar darboğaza çevrilir. Bu cür sistemlər xüsusi tapşırıqlar üçün unikal həllər ilə xarakterizə olunur, universal və güclü sistemlər RDBMS-lər çox vaxt saniyədə yüz minlərlə paralel əməliyyatlar üçün çox yavaş olur.

Nəticə budur ki, aydın bir alqoritm yoxdur. Hər dəfə qərar memarların və menecerin ixtiyarındadır və bu, layihənin yarış şərtləri və NoSQL məlumatlarının uyğunsuzluğu, performans və ORM sorğularının düzəldilməsi ilə bağlı problemlərdə ilişib qalmasından və ya saxlanılan funksiyalardan istifadə edərkən DBMS miqyasında problemlərlə üzləşməsindən asılıdır. . Ona görə də düzgün qərarlar verin :)

İşin məqsədi– verilənlər bazası serverində saxlanılan prosedurları necə yaratmağı və istifadə etməyi öyrənin.

1. Bütün nümunələr üzərində işləmək, onların SQL Server Management Studio utilitində icrasının nəticələrini təhlil etmək. Yaradılmış prosedurların cari verilənlər bazasında olub-olmadığını yoxlamaq.

2. Laboratoriya işlərinin gedişində bütün nümunələrin və tapşırıqların yerinə yetirilməsi.

3. Variantlara görə fərdi tapşırıqların yerinə yetirilməsi.

İş izahatları

Saxlanılan prosedurların proqramlaşdırılmasını mənimsəmək üçün adlanan verilənlər bazası nümunəsindən istifadə edirik DB_Kitablar, 1 saylı laboratoriya işində yaradılmışdır. Nümunələr və tapşırıqları yerinə yetirərkən verilənlər bazasının, cədvəllərin və layihənin digər obyektlərinin adları arasındakı uyğunluğa diqqət yetirin.

Saxlanılan prosedurlar bir və ya bir neçə SQL ifadəsi və ya funksiyasından ibarət olan və tərtib edilmiş formada verilənlər bazasında saxlanılan əmrlər toplusudur.

Saxlanılan prosedurların növləri

Sistemdə saxlanılan prosedurlar müxtəlif inzibati hərəkətləri yerinə yetirmək üçün nəzərdə tutulmuşdur. Demək olar ki, bütün server idarəetmə hərəkətləri onların köməyi ilə həyata keçirilir. Deyə bilərik ki, sistemdə saxlanılan prosedurlar sistem cədvəlləri ilə işi təmin edən interfeysdir. Sistemdə saxlanılan prosedurlara sp_ prefiksi qoyulur, sistem verilənlər bazasında saxlanılır və istənilən digər verilənlər bazası kontekstində çağırıla bilər.

Xüsusi saxlanılan prosedurlar müəyyən hərəkətləri həyata keçirir. Saxlanılan prosedurlar tam verilənlər bazası obyektidir. Nəticədə, hər bir saxlanılan prosedur yerinə yetirildiyi xüsusi verilənlər bazasında yerləşir.

Müvəqqəti saxlanılan prosedurlar yalnız qısa müddətə mövcuddur, bundan sonra server tərəfindən avtomatik olaraq məhv edilir. Onlar yerli və qlobal bölünür. Yerli müvəqqəti saxlanan prosedurlar yalnız yaradıldıqları əlaqədən çağırıla bilər. Belə bir prosedur yaratarkən ona tək # simvolu ilə başlayan ad verilməlidir. Bütün müvəqqəti obyektlər kimi, istifadəçi serveri ayırdıqda, yenidən işə saldıqda və ya dayandırdıqda bu tip saxlanılan prosedurlar avtomatik olaraq silinir. Qlobal müvəqqəti saxlanılan prosedurlar eyni prosedura malik olan serverdə istənilən əlaqə üçün mövcuddur. Onu müəyyən etmək üçün ona ## simvolu ilə başlayan ad vermək kifayətdir. Bu prosedurlar server yenidən işə salındıqda və ya dayandırıldıqda və ya kontekstində yaradıldıqları əlaqə bağlandıqda silinir.

Saxlanılan prosedurların yaradılması, dəyişdirilməsi

Saxlanılan prosedurun yaradılması aşağıdakı vəzifələrin həllini nəzərdə tutur: giriş hüquqlarının planlaşdırılması. Saxlanılan proseduru yaradarkən nəzərə alın ki, o, verilənlər bazası obyektlərinə onu yaradan istifadəçi ilə eyni giriş hüquqlarına malik olacaq; saxlanılan prosedurun parametrlərinin müəyyən edilməsi, saxlanılan prosedurların giriş və çıxış parametrləri ola bilər; saxlanılan prosedur kodunun inkişafı. Prosedur kodunda digər saxlanılan prosedurlara çağırışlar da daxil olmaqla istənilən SQL əmrləri ardıcıllığı ola bilər.

MS SQL Server notasiyasında yenisini yaratmaq və ya mövcud saxlanılan proseduru dəyişdirmək üçün sintaksis belədir:

( YARAT | DƏYİŞTİR ) PROC[ EDURE] prosedur_adı [ ;nömrə] [ ( @parameter_name datatype ) [ VARYING ] [ = DEFAULT ] [ OUTPUT] ] [ ,... n] [ WITH ( YENİDƏN TƏRKİB | ŞİFRƏLƏMƏ | YENİDƏN TƏRƏM ET, ŞİFRELƏMƏ )] [ REPLİKASYON ÜÇÜN] sql_statement KİMİ [ ... n]

Bu əmrin parametrlərini nəzərdən keçirin.

sp_, #, ## prefikslərindən istifadə etməklə yaradılmış prosedur sistem və ya müvəqqəti prosedur kimi müəyyən edilə bilər. Komandanın sintaksisindən də göründüyü kimi, yaradılan prosedurun aid olacağı sahibin adının, habelə onun yerləşdirilməli olduğu verilənlər bazasının adının göstərilməsinə icazə verilmir. Buna görə də yaratdığınız saxlanılan proseduru konkret verilənlər bazasında yerləşdirmək üçün həmin verilənlər bazası kontekstində CREATE PROCEDURE əmrini yerinə yetirməlisiniz. Saxlanılan prosedurun gövdəsindən eyni verilənlər bazasından obyektlərə daxil olarkən siz qısaldılmış adlardan, yəni verilənlər bazasının adını göstərmədən istifadə edə bilərsiniz. Başqa verilənlər bazalarında yerləşən obyektlərə istinad etmək istədiyiniz zaman verilənlər bazası adının göstərilməsi məcburidir.

Yaradılmış saxlanan prosedurda giriş və çıxış məlumatlarını ötürmək üçün parametr adları @ simvolu ilə başlamalıdır. Siz bir saxlanılan prosedurda vergüllə ayrılmış çoxlu parametrləri təyin edə bilərsiniz. Prosedurun gövdəsi adları prosedurun parametrlərinin adları ilə eyni olan yerli dəyişənlərdən istifadə etməməlidir. İstənilən SQL məlumat növü, o cümlədən istifadəçi tərəfindən təyin olunanlar, saxlanılan prosedur parametrlərinin məlumat növünü təyin etmək üçün uyğundur. Bununla belə, CURSOR məlumat növü yalnız saxlanılan prosedurun çıxış parametri kimi istifadə edilə bilər, yəni. OUTPUT açar sözü ilə.

OUTPUT açar sözünün olması o deməkdir ki, müvafiq parametr saxlanılan prosedurdan verilənləri qaytarmaq üçün nəzərdə tutulub. Ancaq bu, parametrin dəyərləri saxlanılan prosedura ötürmək üçün uyğun olmadığını ifadə etmir. OUTPUT açar sözünün təyin edilməsi saxlanılan prosedurdan çıxdıqda serverə parametrin cari dəyərini prosedur çağırılan zaman parametr dəyəri kimi təyin edilmiş yerli dəyişənə təyin etməyi tapşırır. Nəzərə alın ki, OUTPUT açar sözünü təyin edərkən proseduru çağırarkən müvafiq parametrin dəyəri yalnız lokal dəyişəndən istifadə etməklə təyin edilə bilər. Normal parametrlər üçün icazə verilən hər hansı ifadə və ya sabitlərə icazə verilmir. VARYING açar sözü CURSOR tipli OUTPUT parametri ilə birlikdə istifadə olunur. Çıxış parametrinin nəticə dəsti olacağını müəyyən edir.

DEFAULT açar sözü müvafiq parametrin standart olaraq qəbul edəcəyi dəyərdir. Beləliklə, proseduru çağırarkən müvafiq parametrin qiymətini açıq şəkildə göstərməmək mümkündür.

Server sorğunun icra planını və tərtib edilmiş kodu önbelleğe aldığından, növbəti dəfə prosedur çağırıldıqda artıq hazırlanmış dəyərlərdən istifadə olunacaq. Bununla belə, bəzi hallarda hələ də prosedur kodunu yenidən tərtib etmək lazımdır. RECOMPILE açar sözünün göstərilməsi sistemə hər dəfə saxlanılan prosedur üçün icra planı yaratmağı tapşırır.

REPLİKASYON ÜÇÜN seçimi verilənlərin təkrarlanması və yaradılan saxlanılan prosedurun nəşrə məqalə kimi daxil edilməsi zamanı tələb olunur. ENCRYPTION açar sözü serverə saxlanılan prosedur kodunu şifrələməyi tapşırır ki, bu da saxlanılan proseduru həyata keçirən xüsusi alqoritmlərin istifadəsindən müdafiəni təmin edə bilər. AS açar sözü saxlanılan prosedur gövdəsinin özünün əvvəlində yerləşdirilir. Demək olar ki, bütün SQL əmrləri prosedur orqanında istifadə edilə bilər, əməliyyatlar elan edilə bilər, kilidlər təyin edilə bilər və digər saxlanılan prosedurlar çağırıla bilər. RETURN əmri ilə saxlanılan prosedurdan çıxa bilərsiniz.

Saxlanılan prosedurun silinməsi

DROP PROSEDURE (prosedur_adı) [ ,... n]

Saxlanılan Prosedurun İcrası

Saxlanılan proseduru yerinə yetirmək üçün aşağıdakı əmrdən istifadə olunur: [ [ EXEC [ UTE] prosedur_adı [ ;nömrə] [ [ @parametr_adı= ] ( dəyər | @dəyişən_adı) [ ÇIXIŞ ] | [ DEFAULT ] ] [ ,...n]

Saxlanılan prosedur çağırışı topluda yeganə əmr deyilsə, EXECUTE əmrinin olması məcburidir. Bundan əlavə, bu əmr başqa bir prosedurun və ya triggerin gövdəsindən proseduru çağırmaq üçün tələb olunur.

Prosedur çağırışında OUTPUT açar sözünün istifadəsinə yalnız prosedur OUTPUT açar sözü ilə yaradılan zaman elan edilmiş parametrlər üçün icazə verilir.

Parametr üçün DEFAULT açar sözü ilə prosedur çağırıldıqda, standart dəyər istifadə olunacaq. Təbii ki, göstərilən DEFAULT sözünə yalnız standart dəyərin təyin olunduğu parametrlər üçün icazə verilir.

EXECUTE əmrinin sintaksisindən proseduru çağırarkən parametr adlarının buraxıla biləcəyini görə bilərsiniz. Bununla belə, bu halda istifadəçi parametrlər üçün dəyərləri prosedur yaradılarkən siyahıya alındığı ardıcıllıqla göstərməlidir. Siz sadəcə olaraq siyahıda onu buraxmaqla parametrə standart dəyər təyin edə bilməzsiniz. Defolt dəyəri olan parametrləri buraxmaq istəyirsinizsə, saxlanılan proseduru çağırarkən parametr adlarını açıq şəkildə göstərmək kifayətdir. Üstəlik, bu şəkildə parametrləri və onların dəyərlərini istənilən qaydada sadalaya bilərsiniz.

Qeyd edək ki, prosedur çağırılan zaman ya dəyərləri olan parametr adları, ya da yalnız parametr adı olmayan dəyərlər göstərilir. Onların birləşməsinə icazə verilmir.

Saxlanılan Prosedurda RETURN-dən istifadə

Göstərilən şərtə uyğun olaraq istənilən nöqtədə prosedurdan çıxmağa imkan verir, həmçinin prosedurun icrasının nəticəsini rəqəm kimi köçürməyə imkan verir ki, bu da prosedurun keyfiyyətini və düzgünlüyünü mühakimə edə bilərsiniz. Parametrləri olmayan bir prosedur yaratmaq nümunəsi:

Books GO-DAN SEÇİM SAYI OLARAQ Count_Books (Kod_kitabı) PROSEDURU YARATIN

Məşq 1.

EXEC Count_Books

Nəticəni yoxlayın.

Giriş parametri ilə prosedur yaratmaq nümunəsi:

Count_Books_Pages @Count_pages PROSEDURU YARADIN Səhifələr>= @Sayfa_sayfalar GEDİLƏN KİTABLARDAN SEÇİM SAYI (Kod_kitabı) KİMİ

Tapşırıq 2. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Komanda ilə işləyin

EXEC Count_Books_Pages 100

Nəticəni yoxlayın.

Giriş parametrləri ilə bir prosedur yaratmaq nümunəsi:

PROSEDUR YARATIN Count_Books_Title @Count_pages AS INT , @Title AS CHAR (10 ) SY CHAR (Kod_book) FROM WHERE Pages>= @Count_pages VƏ Title_book KİMİ @Title GO

Tapşırıq 3. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Komanda ilə işləyin

EXEC Count_Books_Title 100 , "P%"

Nəticəni yoxlayın.

Giriş parametrləri və çıxış parametri ilə prosedur yaratmağa nümunə:

PROSEDUR YARATIN Count_Books_Itogo @Count_pages INT , @Title CHAR (10 ) , @Itogo GİRİŞ ÇIXIŞI SEÇİLƏK @Itogo = COUNT (Kod_kitabı) KİTABLARDAN HARADA Səhifələr>= @Sayfa_səhifələr VƏ Başlıq_kitabı KİMİ @Title GO

Tapşırıq 4. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Bir sıra əmrlərlə işləyin:

Sql> @q elan et int EXEC Count_Books_Itogo 100, "P%", @q çıxışı @q seçin

Nəticəni yoxlayın.

Giriş parametrləri və RETURN ilə prosedurun yaradılması nümunəsi:

CREATE PROCEDURE checkname @param INT KİMİ (Ad_author FROM müəlliflərdən SEÇİN Code_author = @param) = "Puşkin A.S." GERİ DÖNÜŞ 1 BAŞQA 2

Tapşırıq 5. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Bunu əmrlərlə işə salın:

BƏYAN EDİN @return_status INT EXEC @return_status = yoxlama adı 1 SEÇİN "Qayıdış statusu" = @return_status

Satınalmalar cədvəlində əsas sahənin dəyərini ikiqat artırmaq üçün parametrləri olmayan prosedurun yaradılması nümunəsi:

YENİLƏNMƏ KİMİ PROC update_proc YARATIN Satınalmalar SET Code_purchase = Code_purchase* 2

Tapşırıq 6. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Komanda ilə işləyin

EXEC update_proc

Müəyyən bir müəllif haqqında bütün məlumatları əldə etmək üçün giriş parametri olan prosedura nümunə:

PROC CREATE select_author @k CHAR (30 ) SEÇİLMƏK KİMİ * Müəlliflərdən HARADA name_author= @k

Tapşırıq 7.

EXEC select_author "Puşkin A.S." və ya select_author @k= "Puşkin A.S." və ya EXEC select_author @k= "Puşkin A.S."

Satınalmalar cədvəlindəki açar sahəsinin dəyərini müəyyən edilmiş sayda (standart olaraq 2 dəfə) artırmaq üçün giriş parametri və standart dəyəri olan prosedurun yaradılması nümunəsi:

PROC YARATIN update_proc @p INT = 2 YENİLƏNMİŞ KİMİ Satınalmalar SET Kod_alış = Kod_alış * @p

Prosedur heç bir məlumatı qaytarmır.

Tapşırıq 8. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Bunu əmrlərlə işə salın:

EXEC update_proc 4 və ya EXEC update_proc @p = 4 və ya EXEC update_proc --defolt dəyər istifadə olunacaq.

Giriş və çıxış parametrləri ilə prosedurun yaradılması nümunəsi. Müəyyən bir müddət ərzində yerinə yetirilən sifarişlərin sayını müəyyən etmək üçün prosedur yaradın:

@d1 VƏ @d2 ARASINDA TARİX_Sifariş OLDUĞUNDA @c = ISNULL (@c, 0 ) OLDUĞU SATIŞLARDAN PROC count_applises @d1 SMALLDATETIME, @d2 SMALLDATETIME, @c SEÇİM @c= COUNT (Kod_satın alma) KİMİ İNT ÇIXIŞI YARATIN

Tapşırıq 9. Bu proseduru SQL server Management Studio yardım proqramından istifadə edərək DB_Books verilənlər bazasının Saxlanan Prosedurlar bölməsində yaradın. Bunu əmrlərlə işə salın:

DECLARE @c2 INT EXEC count_purchases '01- iyun- 2006 ', '01- iyul- 2006 ', @c2 OUTPUT SELECT @c2

üçün tapşırıq variantları laboratoriya işi №4

Ümumi müddəalar. SQL Server Management Studio-da yaradın yeni səhifə kod üçün ("Sorğu yarat" düyməsi). Yaradılmış DB_Books verilənlər bazasını proqramlı şəkildə Use ifadəsindən istifadə edərək aktiv edin. Create proseduru ifadələrindən istifadə edərək saxlanılan prosedurları yaradın və prosedurların adlarını özünüz təyin edin. Hər bir prosedur ikinci laboratoriyada yerinə yetirilən bir SQL sorğusunu yerinə yetirəcək. Üstəlik, sorğuların SQL kodu axtarılan sahələrin dəyərlərini ötürə biləcək şəkildə dəyişdirilməlidir.

Məsələn, №2 laboratoriyadakı orijinal tapşırıq və sorğu:

/*Təchizatçı kataloqundan (Çatdırılma cədvəli) şirkətlərin adlarını, telefon nömrələrini və şirkət adı (Sahənin_şirkəti) OAO MIR olan VÖEN-ni (Sahələrin Adı_şirkət, Telefon və İNN) seçin.

Adı_şirkət, Telefon, İNN SEÇİN HARADA Çatdırılmalar Adı_şirkət = "JSC MIR"

*/ – Bu işdə prosedur yaradılacaq:

PROC CREATE select_name_company @comp CHAR (30 ) KİMİ SEÇİM Adı_şirkət, Telefon, INN FROM Çatdırılmalar HARADA Adı_şirkət = @comp

– Proseduru başlamaq üçün əmrdən istifadə edin:

EXEC select_name_company "JSC MIR"

Tapşırıq siyahısı

SQL Server Management Studio-da yeni proqram yaradın. Lab №1-də yaradılmış fərdi verilənlər bazasını proqramlı şəkildə Use ifadəsindən istifadə edərək aktiv edin. Create proseduru ifadələrindən istifadə edərək saxlanılan prosedurları yaradın və prosedurların adlarını özünüz təyin edin. Hər bir prosedur bir SQL sorğusunu yerinə yetirəcək, bu sorğular seçimlər üzrə ayrıca tapşırıqlar kimi təqdim olunur.

Seçim 1

1. Ən azı bir uşağı olan işçilərin siyahısını göstərin.

2. Müəyyən edilmiş müddətdə hədiyyə almış uşaqların siyahısını göstərin.

3. Azyaşlı uşaqları olan valideynlərin siyahısını göstərin.

4. Göstərilən nömrədən daha çox dəyərə malik hədiyyələr haqqında məlumatı tarixə görə sıralayın.

Seçim 2

1. Göstərilən tipli qurğuların siyahısını göstərin.

2. Təmir edilmiş cihazların sayını və göstərilən ustadan təmirin ümumi dəyərini göstərin.

3. Cihaz sahiblərinin siyahısını və onların hitlərinin sayını azalan sıra ilə hitlərin sayına görə sıralayın.

4. Rütbəsi göstərilən nömrədən çox olan və ya işə qəbul tarixi göstərilən tarixdən az olan magistrlər haqqında məlumatı göstərin.

Seçim 3

2. Göstərilən nömrədən artıq məbləğə güllərin satıldığı satış kodlarının siyahısını göstərin.

3. Göstərilən satış kodu üçün satış tarixini, məbləğini, satıcısını və çiçəyini göstərin.

4. Rənglərin siyahısını göstərin və hündürlüyü göstərilən saydan çox olan və ya çiçək açan çiçəklər üçün çeşidləyin.

Seçim 4

1. İstifadəyə dair göstərişi olan dərmanların siyahısını göstərin.

2. Eyni adlı dərmanın müəyyən edilmiş sayından artıq satıldığı çatdırılma tarixlərinin siyahısını göstərin.

3. Çatdırılma tarixini, məbləğini, təchizatçıdan menecerin tam adını və dərmanın adını göstərilən nömrədən çox qəbz kodu ilə göstərin.

Seçim 5

2. Göstərilən səbəbdən istismardan çıxarılan avadanlıqların siyahısını göstərin.

3. Göstərilən müddət ərzində istismardan çıxarılan avadanlıqların qəbul tarixi, avadanlığın adı, məsul şəxsin tam adı və istismardan çıxarılma tarixi göstərilir.

4. Göstərilən tipli və ya qəbul tarixi müəyyən dəyərdən çox olan avadanlıqların siyahısını göstərin

Variant 6

1. Çəkisi müəyyən edilmiş saydan çox olan yeməklərin siyahısını göstərin.

2. Adlarında göstərilən söz fraqmenti olan məhsulların siyahısını göstərin.

3. Məhsulun həcmini, yeməyin adını, məhsulun adını göstəriləndən qab kodu ilə göstərin ilkin dəyər müəyyən bir son dəyərə.

4. Karbohidratların miqdarı müəyyən bir dəyərdən çox olan yeməyin bişirilmə qaydasını və yeməyin adını və ya müəyyən edilmiş dəyərdən çox kalori miqdarını göstərin.

Seçim 7

1. Göstərilən vəzifə ilə işçilərin siyahısını göstərin.

3. Göstərilən müddət ərzində qeydə alınmış sənədlər üçün qeydiyyat tarixini, sənədin növünü, registratorun tam adını və təşkilatın adını göstərin.

4. Müəyyən bir sənəd növü və ya qeyd olunan dəyərdən çox qeydiyyat tarixi ilə qeydə alınmış sənədlərin siyahısını göstərin.

Seçim 8

1. İşdən çıxmaq üçün göstərilən səbəblə işçilərin siyahısını göstərin.

3. Göstərilən müddət ərzində qeydə alınmış sənədlər üçün qeydiyyat tarixini, işdən çıxarılma səbəbini, işçinin tam adını göstərin.

Seçim 9

1. Göstərilən növdə məzuniyyətə çıxan işçilərin siyahısını göstərin.

2. Göstərilən müddət ərzində qeydiyyat tarixi olan sənədlərin siyahısını göstərin.

3. Göstərilən müddət ərzində qeydiyyatdan keçmiş sənədlər üçün qeydiyyat tarixini, məzuniyyət növünü, işçinin tam adını göstərin.

4. Göstərilən diapazonda sənəd kodu olan qeydə alınmış sənədlərin siyahısını göstərin.

Seçim 10

1. Göstərilən vəzifə ilə işçilərin siyahısını göstərin.

2. Göstərilən söz fraqmentini ehtiva edən sənədlərin siyahısını göstərin.

3. Göstərilən müddət ərzində qeydə alınmış sənədlər üçün qeydiyyat tarixi, sənədin növü, göndərənin tam adı və təşkilatın adı göstərilir.

4. Göstərilən sənəd növü və ya sənəd kodu müəyyən dəyərdən az olan qeydə alınmış sənədlərin siyahısını göstərin.

Seçim 11

1. Göstərilən vəzifəyə təyin edilmiş işçilərin siyahısını göstərin.

2. Göstərilən müddət ərzində qeydiyyat tarixi olan sənədlərin siyahısını göstərin.

3. Göstərilən müddət ərzində qeydiyyatdan keçmiş sənədlər üçün qeydiyyat tarixini, vəzifəsini, işçinin tam adını göstərin.

4. Göstərilən diapazonda sənəd kodu olan qeydə alınmış sənədlərin siyahısını göstərin.

Seçim 12

3. Avadanlıq icarəyə götürmüş şəxslərin siyahısını və onların sorğularının sayını azalan qaydada sorğuların sayına görə sırala.

Seçim 13

1. Göstərilən tipli avadanlıqların siyahısını göstərin. 2. Müəyyən bir işçinin istismardan çıxardığı avadanlıqların siyahısını göstərin.

3. Avadanlıq növünə görə qruplaşdırılmış istismardan çıxarılan avadanlığın miqdarını göstərin.

4. İşə qəbul tarixi müəyyən bir tarixdən daha çox olan işçilər haqqında məlumatı göstərin.

Seçim 14

1. Göstərilən yarpaq növü ilə çiçəklərin siyahısını göstərin.

2. Çiçəklərin müəyyən dəyərdən yuxarı məbləğlərə satıldığı qəbz kodlarının siyahısını göstərin.

3. Qəbul tarixini, məbləği, təchizatçının adlarını və konkret təchizatçı kodu üçün rəngləri göstərin.

4. Çiçəklərin siyahısını və hündürlüyü müəyyən saydan çox olan və ya çiçək açan çiçəklər üçün növünü göstərin.

Seçim 15

1. Göstərilən müddətdə otaqlara gələn müştərilərin siyahısını göstərin.

2. Hər bir müştəri üçün otaqlar üçün ödənişlərin ümumi məbləğini göstərin.

3. Göstərilən müddət ərzində qeydiyyatdan keçmiş müştərilərin gəliş tarixini, otaq tipini, tam adını göstərin.

4. Müəyyən tipli otaqlarda qeydiyyatdan keçmiş müştərilərin siyahısını göstərin.

Variant 16

1. Göstərilən tipli avadanlıqların siyahısını göstərin.

2. Müəyyən bir müştərinin icarəyə götürdüyü avadanlıqların siyahısını göstərin.

3. Avadanlıq icarəyə götürmüş şəxslərin siyahısını və onların sorğularının sayını azalan qaydada sorğuların sayına görə sırala.

4. Müştərilər haqqında məlumatı ünvanlar üzrə çeşidlənmiş göstərin.

Variant 17

1. Alış qiyməti müəyyən dəyərdən və ya zəmanət müddəti göstərilən nömrədən çox olan qiymətlilərin siyahısını göstərin.

2. Göstərilən sözün adında baş verdiyi maddi sərvətlərin yerlərinin siyahısını göstərin.

3. Qiymətli əşyaların dəyərinin cəmini müəyyən edilmiş diapazonda kodla göstərin.

4. Göstərilən diapazonda iş tarixi ilə maddi məsul şəxslərin siyahısını göstərin.

Variant 18

1. Müəyyən bir usta tərəfindən yerinə yetirilən təmirlərin siyahısını göstərin.

2. İşə daxil edilmiş, başlığında göstərilən sözün baş verdiyi iş mərhələlərinin siyahısını göstərin.

3. Göstərilən diapazonda kodlu işlər üçün təmir işlərinin mərhələlərinin dəyərinin cəmini göstərin.

4. Göstərilən diapazonda iş tarixi ilə ustaların siyahısını göstərin.

Variant 19

1. Xüsusi göstərişi olan dərmanların siyahısını göstərin.

2. Müəyyən sayda dərman satan qəbz nömrələrinin siyahısını göstərin.

3. Göstərilən nömrə ilə qəbz üçün satış tarixini, məbləğini, kassirin tam adını və dərmanı göstərin.

4. Dərman vasitələrinin siyahısını və qablaşdırma miqdarı göstərilən nömrədən çox olan dərman vasitələri üçün ölçü vahidlərini və ya dərman kodunu müəyyən dəyərdən az göstərin.

Seçim 20

1. Göstərilən vəzifə ilə işçilərin siyahısını göstərin.

2. Göstərilən söz fraqmentini ehtiva edən sənədlərin siyahısını göstərin.

3. Göstərilən müddətdə qeydə alınmış sənədlər üçün qeydiyyat tarixi, sənədin növü, icraçının tam adı və icra faktı göstərilir.

4. Göstərilən sənəd növü ilə və ya müəyyən diapazonda sənəd kodu ilə qeydə alınmış sənədlərin siyahısını göstərin.