Қазақстан республикасының бiлiм және ғылым министрлiгi



жүктеу 1.8 Mb.
бет3/11
Дата22.10.2017
өлшемі1.8 Mb.
1   2   3   4   5   6   7   8   9   10   11



6. Агрегаттық функциялар


Скалярлық функциялар кестенің бір жолынан не кестелер біріктірулерінен мәндерді өңдейді. SQL функциялардың басқа бір типі жолдар жинағының баған мәндерін есептеу негізінде құрастырылған. Мұндай функциялар агрегаттық (статикалық) функциялар не баған функциялары деп аталады.

4 кестеде барлық агрегаттық функциялардың тізімі берілген.

Кесте 4 – SQL Server агрегаттық функциялары

Агрегаттық функциялар

Сипаттамасы


AVG (өрнек)

Өрнектің бос емес мәндердің жинағының орта мәні.

CHECKSUM_AGG (өрнек)

Өрнектің бос емес мәндердің бақылау қосындысы.

COUNT (*)

COUNT (өрнек)

COUNT (DISTINCT өрнек)


COUNT (*) берілген жолдар жинағында жолдар санын қайтарады. COUNT кілттік сөзі қолданылғанда, DISTINCT кілттік сөзі қолданылуы мүмкін емес. COUNT (өрнек) өрнектің бос емес мәндердің санын қайтарады. Егер DISTINCT кілттік сөзі берілсе, онда COUNT функциясы өрнектің уникалды бос емес мәндердің санын қайтарады. COUNT формасының барлық функциялары int типтес мәнді қайтарады.

COUNT_BIG (*)

COUNT_BIG (өрнек)

COUNT_BIG (DICTINCT өрнек)


COUNT_BIG функциясы COUNT функциясы ұқсас, бірақ айырмашылығы, COUNT_BIG функциясы bigint типтес мәнді қайтарады.

GROUPING (баған)

1 қайтарады, егер агрегатты жол CUBE не ROLLUP операторларымен қосылса, кері жағдайда 0 қайтарады.

MAX (өрнек)

Өрнектің бос емес мәндердің максималды мәні.

MIN (өрнек)

Өрнектің бос емес мәндердің минималды мәні.

SUM (өрнек)

Өрнектің барлық бос емес мәндердің қосындысы.

STDEV (өрнек)

Өрнектің бос емес мәндердің ортаквадраттық ауысуы.

STDEV P (өрнек)

Ығыстырылған өрнектің бос емес мәндердің ортаквадраттық ауысуы.

VAR (өрнек)

Өрнектің бос емес мәндердің дисперсиясы.

VARP (өрнек)

Өрнектің бос емес мәндердің ығыстырылған дисперсиясы.



Дәріс 5. SELECT инструкциясын қолданудың мысалдары.

Жоспар

1. SELECT инструкциясын қолдану.


2. Қисын операторлары.

1. SELECT инструкциясын қолдану.


SELECT командасы кестеден бір анықталған ақпаратты алуға мүмкін. Мысалға, кестенің анықталған бағандарды таңдауды қарастырайық. Сұраныс:

SELECT sname, comm

FROM Salespeople

келесі шығарады:

sname comm

-------- -----------

Иванов 12

Петров 13

Егоров 10

Сидоров 11

Шилин 15

DISTINCT - SELECT командасында екілік мәндерді жою үшін арналған аргумент. Мысалы, бізге керек қай агентте қазіргі уақытта тапсырыстары бар, сонымен қатар керегі тек агенттердің кодтар тізімі (snum). Сондықтан келесіні енгізесіз:

SELECT snum

FROM Orders

Сонда нәтижесі мынадай:

snum

-----------



1007

1004


1001

1002


1007

1002


1001

1003


1002

1001


Мысалдан көрініп тұр кодтар қайталанады. Тізімді дубликаттарсыз шығару үшін келесіні енгіземіз:

SELECT DISTINCT snum

FROM Orders

Сонда нәтижесі мүлдем басқа болады:

snum

-----------



1001

1002


1003

1004


1007

SELECT командасында DISTINCT тек бірақ рет ғана белгіленуі керек, егер бірнеше бағандар таңдалса, онда DISTINCT таңдалған өрістердің бірдей мәндермен жолдарды қарастырмайды. Мәндері бірдей жолдар сақталады.

DISTINCT орынына ALL белгілеуге болады. Бұл жағдайда, жолдардың дублерлеуі сақталады.

SELECT командасының WHERE сөйлемі кестенің әр жолы үшін дұрыс, не бұрыс шарттарын орындауға мүмкіндік береді. Команда тек шартты қанағаттандыратын кестенің жолдарын шығарады. Мысалы, сізге қажет Алматының барлық агенттердің аттары мен комиссиялары:

SELECT sname, city

FROM Salespeople

WHERE city = 'Алматы'

Егер сұраныста WHERE SQL Server сөйлемі кездессе, онда ол жолдап кестені қарастырып, тұжырымдама дұрыс екендігіне әр жолды тексереді.

Енді WHERE сөйлемінде сандық өріспен сұранысты құрастырып көрейік. Заказчики (Customers) кестенің rating өрісі әр критерийлерге тапсырушыларды бөлу үшін арналған. Мысалы алдындағы тапсырыстардың көлеміне байланысты кредитті бағалау. 100 рейтингімен барлық тапсырушыларды таңдайық:

SELECT *

FROM Customers

WHERE rating = 100

Мұнда тырнақшалар қолданылмайды, себебі, рейтинг – бұл сандық өріс. Сұраныстың нәтижесі:

CNUM CNAME CITY RATING SNUM

----- ------------------ ------- ----------- -----------

2001 ТОО Sulpak Алматы 100 1001

2006 Clemens Лондон 100 1001

2007 ОАО "ООО" ТОМСК 100 1004

Transact-SQL жазбаларды таңдаудың күрделі шарттарын құрастыру үшін қолданылады. Ол үшін қатынас операторлары, қисын операторлары, арнайы операторлар қызмет етеді.

Қатынас операторлары бұл:


  • = тең

  • > бұдан үлкен

  • < бұдан кіші

  • >= үлкен не тең

  • <= кіші не тең

  • <> тең емес

Символдық мәндер мен күн мерзімі үшін стандартты мәндері бар. Символдық мәндер олардың кодтар терминдерінде салыстырылады.

Мысалы бізге рейтингтері 200 тең барлық тапсырушылары қажет:

SELECT *

FROM Customers

WHERE rating > 200

Нәтижесі:

CNUM CNAME CITY RATING SNUM

----- --------------------------------- ---------- ------- -----

2004 Концерн "Дети лейтенанта Шмидта" Бобруйск 300 1002

2008 ОАО "Валют-транзит" Караганда 300 1007


2. Қисын операторлары

  • AND қисын "И"

  • OR қисын "ИЛИ"

  • NOT қисын болдырмау

AND операторы екі қисын мәнді салыстырып, TRUE (ақиқат) мәнін қайтарады, егер екі мәнде ақиқат болса (яғни, TRUE), басқа жағдайда - FALSE (жалған).

OR операторы TRUE қайтарады, егер аргументтердің бірі ғана TRUE мәніне тең болса.

NOT операторы TRUE қайтарады, егер оның аргументі FALSE тең болса не керісінше.

Қисын операторларды қолдану SELECT командасының мүмкіндіктерін жоғарлатады. Мысалы, рейтингі 200 тең Қарағандының тапсырушыларын қарастыру керек. Команда келесі түрде болады:

SELECT *

FROM Customers

WHERE city = 'Караганда' AND

rating > 200

Біздің дерекқорында бұл шартты қанағаттандыратын тек бір ғана тапсырушы бар:

CNUM CNAME CITY RATING SNUM

----- --------------------------------- ---------- ------- -----

2008 ОАО "Валют-транзит" Караганда 300 1007

Егер OR қолданылса, онда Қарағандыда орналасқан және рейтингтері 200-ден жоғары барлық тапсырушыларды аламыз:

SELECT *


FROM Customers

WHERE city = 'Караганда' OR

rating > 200

Результат запроса:

CNUM CNAME CITY RATING SNUM

----- --------------------------------- ---------- ------- -----

2004 Концерн "Дети лейтенанта Шмидта" Бобруйск 300 1002

2008 ОАО "Валют-транзит" Караганда 300 1007



NOT мәндерді инвертрлеу үшін қолданылады. Сұраныс:

SELECT *


FROM Customers

WHERE city = "Караганда" OR

NOT rating > 200

Нәтиже:


CNUM CNAME CITY RATING SNUM

----- -------------------- --------- ------- ------

2001 ТОО Рога и копыта Москва 100 1001

2002 AО Бендер и К Одесса 200 1003

2003 Фирма ХХХ Рязань 200 1002

2006 Clemens Лондон 100 1001

2007 ОАО "ООО" ТОМСК 100 1004

2008 ОАО "Валют-транзит" Караганда 300 1007

Өрнектерді топтау үшін Transact-SQL – дөңгелек жақшаларын ( ) пайдаланады. Мысалы:

SELECT *


FROM Customers

WHERE NOT (city = 'Караганда' OR

rating > 200)

Бұл сұраныс Қарағандыда орналаспаған және рейтингі 200 кем тапсырушыларды таңдайды. Нәтижесі:

CNUM CNAME CITY RATING SNUM

----- ------------------ ------- ------- -----

2001 ТОО Рога и копыта Москва 100 1001

2002 AО Бендер и К Одесса 200 1003

2003 Фирма ХХХ Рязань 200 1002

2006 Clemens Лондон 100 1001

2007 ОАО "ООО" ТОМСК 100 1004

Арнайым операторлар: IN, BETWEEN, LIKE, IS NULL.



IN операторы өріс мәні кіретін мәндер тізімін анықтайды. Мысалы, сізге Мәскеудегі не Хабаровскедегі орналасқан барлық сатушыларды табу керек болсын. Ол үшін келесі сұраныс қолданылады:

SELECT *

FROM Salespeople

WHERE city = 'Москва' OR

city = 'Хабаровск'

Бұданда қарапайым тәсілі бар:

SELECT *

FROM Salespeople

WHERE city IN ( 'Москва', 'Хабаровск' )
Бұл сұраныстың нәтижесі:

SNUM SNAME CITY COMM

----- ------- ---------- -----

1001 Иванов Москва 12.0

1002 Петров Хабаровск 13.0

IN операторы үшін мәндер жинағы дөңгелек жақшаларына алынады. Ал мәндер үтір арқылы бөлінеді.

BETWEEN операторы IN операторына ұқсас. Мүмкін болатын мәндер тізімінен айырмашылығы BETWEEN мәндер диапазонын анықтайды. Сұраныста BETWEEN белгілейсіз, содан кейін бастапқы мәнін, AND кілттік сөзін, содан кейін ғана соңғы мәнін. Бірінші мән екінші мәннен кіші болу керек. Келесі сұраныс 10 мен 12 арасындағы комиссиясымен агенттерді шығарады:

SELECT *


FROM Salespeople

WHERE comm BETWEEN 10 AND 12

SNUM SNAME CITY COMM

----- -------- ---------- -----

1001 Иванов Москва 12.0

1003 Егоров Караганда 10.0

1004 Сидоров Сочи 11.0

LIKE операторы ішкі жолдары бар символдық өрістерге ғана қолданылады. Яғни, символ өрісін іздейді оның шартын қанағаттандыру үшін. Шарт ретінде арнайы символдарды қолданады:


  • Астын сызу _ символы – кез келген бірлік символды алмастырады. Мысалы,'к_т' сәйкес болады келесі сөздерге 'кот' и 'кит', бірақ 'крот' сөзіне емес.

  • % процент белгісі – символдардың кез келген сан тізбегін алмастырады. Мысалы, '%м%р' сөзі 'компьютер' және 'омар' сөздеріне сәйкес келеді.

Тапсырушылардың аттары 'О' әріпімен басталатындарды таңдайық:

SELECT *


FROM Customers

WHERE cname LIKE 'О%'

CNUM CNAME CITY RATING SNUM

----- -------------------- ---------- ------- -----

2008 ОАО "Валют-транзит" Караганда 300 1007

2007 ОАО "ООО" ТОМСК 100 1004

NULL мәнін болмауын көрсететіндігінен нәтиже NULL-дің кез келген салыстырмасы болады. Әдетте, кез келген бағанда NULL мәні бар жолдарды қарастырылады. Ол үшін IS NULL арнайы оператор қолданылады. Біздің ДҚ city бағанда NULL мәні бар тапсырушыларды таңдайық:

SELECT *


FROM Customers

WHERE city IS NULL

SQL Server бірнеше агрегаттық функцияларды көрсетеді:


  • COUNT – сұраныс шартын қанағаттандыратын жолдарды есептеу үшін қолданылады

  • SUM – бағанның барлық мәндердің арифметикалық қосындысын есептейді

  • AVG - барлық мәндердің орта арифметикалық қосындысын есептейді

  • MAX – барлық таңдалған мәндердің ішінде ең үлкенді табады

  • MIN - барлық таңдалған мәндердің ішінде ең кішіні табады

SUM және AVG функциялары сандық өрістерге ғана қолданылады. COUNT, MAX, MIN бірге сандық не символдық өрістер қолданыалады. Символдық өрістерді қолданғанда MAX, MIN алфавит ретінде мәндерді салыстырады. Агрегаттық функциялар жұмыс кезінде NULL мәні қарастырылмайды.

Orders кестесінде барлық тапсырыстардың қосындысын табу үшін келесі сұраныс қолданылады:

SELECT SUM( amt )

FROM Orders

Нәтиже:


---------------------

26658.4000



COUNT функциясы басқалардан ерекшеленеді. Ол кестедегі бағанда не жолда мәндер санын есептейді. Мысалы, Orders кестесінде жазылған сауда агенттердің нөмір санын есептеу керек болсын:

SELECT COUNT( DISTINCT snum )

FROM Orders

Нәтиже:

-----------

5

DISTINCT - Orders кестесіндегі snum бағанында ерекше мәндердің саны есептелетінін белгілейді. Оны жазбасақ, нәтиже мүлдем басқа болады:

-----------

10

Кестеде жолдардың жалпы санын есептеу үшін COUNT функциясын жұлдызшамен бірге қолдану керек:



SELECT COUNT(*)

FROM Customers

Нәтиже:

-----------



7

GROUP BY сөйлемі агрегат функциясы қолданатын мәндер жиынын беруге мүмкіндік береді. Бұл бізге SELECT сөйлемінде өріс пен агрегат функцияларын біріктіру мүмкіндігін береді. Мысалы, сізге әр сауда агентімен алынған тапсырыстың ең үлкен қосындысын табу керек болсын:

SELECT snum, MAX( amt )

FROM Orders

GROUP BY snum

Бұл сұраныстың нәтижесі:

snum


----- ----------

1001 9891.8800

1002 5160.4500

1003 1713.2300

1004 1900.1000

1007 1098.1600



GROUP BY жазба топтарына тәуелсіз агрегат функцияларын қолданады. Топты қалыптастыру шарты - өрістердің бірдей мәні (біздің жағдайда snum). Бұл сұранысты өңдегенде MAX функциясы snum әр мәні үшін есептейді.

GROUP BY бірнеше өрістермен қолдануға болады. Алдындағы сұранысты күрделі түрге келтірейік:

SELECT snum, odate, MAX( amt )

FROM Orders

GROUP BY snum, odate

Яғни, біз агент кодтарын және әр күн үшін олардың тапсырыстарының максималды қосындысын таңдаймыз:

snum odate

----- ------------------------ ----------

1001 1999-10-03 00:00:00.000 767.1900

1001 1999-10-05 00:00:00.000 4723.0000

1001 1999-10-06 00:00:00.000 9891.8800

1002 1999-10-03 00:00:00.000 5160.4500

1002 1999-10-04 00:00:00.000 75.7500

1002 1999-10-06 00:00:00.000 1309.9500

1003 1999-10-04 00:00:00.000 1713.2300

1004 1999-10-03 00:00:00.000 1900.1000

1007 1999-10-03 00:00:00.000 1098.1600

Есепті күрделі түрге келтірейік. Енді әр агент тапсырыстарының максималды қосындысы 3000 үлкен деген мәлімет қажет. Ол үшін HAVING сөйлемі керек. Бұл сөйлем WHERE сөйлемі сияқты, топтарды өшіру критерийлерді анықтайды:

SELECT snum, odate, MAX( amt )

FROM ORDERS

GROUP BY snum, odate

HAVING MAX( amt ) > 3000

snum odate

----- ------------------------ ----------

1002 1999-10-03 00:00:00.000 5160.4500

1001 1999-10-05 00:00:00.000 4723.0000

1001 1999-10-06 00:00:00.000 9891.8800

Әлі күнге дейін барлық сұраныстар бір кестеге ғана қатына алған. Бірақ, SQL бір сұраныста бірнеше кестелерге қатына алады.

Кестедегі баған атауы кесте атынан тұрады. Аттардың мысалдары:

Salespeople.snum

Salespeople.city

Orders.odate

Мысалы, бізге қалалар бойынша сауда агенттер мен тапсырушылардың комбинациясын көру керек болсын:

SELECT Customers.cname, Salespeople.sname, Salespeople.city

FROM Salespeople, Customers

WHERE Salespeople.city = Customers.city

Сұраныс нәтижесі:

cname sname city

-------------------- ------- ----------

ТОО Рога и копыта Иванов Москва

ОАО "Валют-транзит" Егоров Караганда

Яғни, city өрісі «Торговые агенты» және «Заказчики» кестелерінде болу керек. Сондықтан, кесте аттары префикстер ретінде қолданылуы керек.

SQL Server екі кестенің жолдар комбинациясын WHERE сөйлемінде берілген шартына тексереді. Егер бұл комбинация оны қанағаттандырса, онда ол шығады.

Кестелерді біріктіру үшін теңдіктен басқа шарттарды да қолдануға болады. Мысалы, бізге агентпен бір қалада тұрмайтын тапсырушылардың барлық тапсырыстары қажет болсын. Ол үшін үш кесте байланысуы керек:

SELECT Orders.onum, Customers.cname, Orders.cnum, Orders.snum

FROM Salespeople, Customers, Orders

WHERE Customers.city <> Salespeople.city AND

Orders.cnum = Customers.cnum AND

Orders.snum = Salespeople.snum

Нәтиже:


onum cname cnum snum

----- ---------------------------------- ----- -----

3001 ОАО "Валют-транзит" 2008 1007

3002 ОАО "ООО" 2007 1004

3005 Фирма ХХХ 2003 1002

3006 AО Бендер и К 2002 1007

3007 Концерн "Дети лейтенанта Шмидта" 2004 1002

3008 Clemens 2006 1001

3009 AО Бендер и К 2002 1003

3010 Концерн "Дети лейтенанта Шмидта" 2004 1002

3011 Clemens 2006 1001

Сұраныстар басқа сұраныстарды басқара алады. Бұл басқа сұраныстың шарт ішінде сұранысты орнатуды білдіреді.

Негізінен, ішкі сұраныс мәнде генерлейді, оның шартына байланысты. Мысалы, біз сауда агенттің атын білеміз – Абенов, бірақ оның кодын білмейміз (snum), бізге керек «Заказы» (Orders) кестесінен оның барлық тапсырыстары.

SELECT *

FROM Orders

WHERE snum = (

SELECT snum

FROM Salespeople

WHERE sname = 'Абенов'

)

Сыртқы сұранысты орындау үшін (негізгі сұраныс), алдымен WHERE сөйлеміндегі ішкі сұраныс орындалады. Ішкі сұраныс орындалғанда Salespeople кестесі қарастырылады. Бұл кестеде sname өрісі «Мауленов» мәнін алып, содан кейін snum өрісі алынады. Бірақ жол болады snum = 1004. Ары қарай, алынған мән негізгі сұраныстың шартына орналасып, шарт түрі келесі түрде болады:



WHERE snum = 1004

Негізгі сұраныс келесі нәтижелермен орындалады:

ONUM ODATE AMT CNUM SNUM

----- ------------------------ ---------- ------ -----

3002 1999-10-03 00:00:00.000 1900.1000 2007 1004

Салыстыру амалдары (үлкен, кіші, тең, тең емес және т.б.) негізінде құрастырылған шарттарды қолданғанда бізге білу керек, ішкі сұраныс тек бір мәнді қайтаратынын.

Егер сізге бірнеше жолдарды қайтару керек болса, онда IN операторын қолдану керек. Мысалы, бізге табу керек Алматыдағы барлық агенттердің тапсырыстары:

SELECT *


FROM Orders

WHERE snum IN (

SELECT snum

FROM Salespeople

WHERE city = 'Алматы'

)

нәтижесі:



ONUM ODATE AMT CNUM SNUM

----- ------------------------ ---------- ----- -----

3003 1999-10-03 00:00:00.000 767.1900 2001 1001

3008 1999-10-05 00:00:00.000 4723.0000 2006 1001

3011 1999-10-06 00:00:00.000 9891.8800 2006 1001

Берілген жағдайда ішкі сұраныстың пайдалануы – біріктіруді қолдануға байланысты:

SELECT Orders.*

FROM Orders, Salespeople

WHERE Orders.snum = Salespeople.snum AND

Salespeople.city = 'Алматы'

Мына сұраныс алдындағы сұранысқа эквиваленті болғанымен, SQL Server екі кестеден құрылған жолдар жинағын қарастыру керек.

Алдындағы барлық ішкі сұраныстарды біріктіреді бір ғана жағдай, олардың бәрі де бір бағанды таңдайды. SELECT * типтес командалар ішкі сұраныстарда мүмкін емес.

Ішкі сұраныстарды HAVING сөйлемдерінде қолдануға болады. Бұл ішкі сұраныстар өздерінің сөйлемдерін қолдана алады: GROUP BY не HAVING. Келесі сұраныс бұған мысал болады:

SELECT rating, COUNT( DISTINCT cnum )

FROM Customers

GROUP BY rating

HAVING rating > (

SELECT AVG( rating )

FROM Customers

WHERE city = 'Алматы'

)

бұл команда Алматыдағы рейтингі орта мәннен жоғары тапсырушыларды есептейді.



Нәтижесі:

rating


------- --

200 2


300 2

Дәріс 6. Сақталатын процедуралар және триггерлер.

Жоспар

1. Сақталатын процедуралар

2. Курсордың қолдануы

3. Триггерлер

4. Қателер туралы мәліметтерді хабарлау.

1. Сақталатын процедуралар


Сақталатын процедуралар Transact-SQL тіліндегі программалық код фрагменті, сонымен қатар олар серверде орындалады. Сақталатын процедураларда кез келген SQL-ұсыныстары қолданылады, тек мыналардан басқа CREATE DEFAULT, CREATE RULE, CREATE TRIGGER және CREATE VIEW.

Сақталатын процедуралардың негізгі қолайлығы – компьютер-сервер қуаттылығымен шектелген ақпаратты тез өңдеуде.

Сақталатын процедуралар жоғарғы деңгейлі тілдердің кәдімгі процедураларына ұқсас, оларда сияқты, енгізу, шығару параметрлері мен жергілікті айнымалылар бар. Сонымен қатар, сандық есептеулер мен символдық мәліметтермен амалдар орындалады. Сақталатын процедураларда дерекқорымен стандартты амалдар орындалады. Сонымен қатар, сақталатын процедураларда циклдер мен таралым қолданылады.

Көру аймағы бойынша келесі сақталатын процедуралардың типтерін айыруға болады: жүйелік (System), жергілікті (Local), уақытша (Temporary) және өшірілетін (Remote).

Жүйелік сақталатын процедуралар сервер мен администратор қолданатын Master деректер қорында сақталады. Жүйелік процедуралардың аттары sp_ символымен басталады. Өздік жүйелік сақталатын процедураларды құру үшін sp_ символымен басталатын атауды меншіктеп, оны Master деректер қорында орналастыру керек.

Жергілікті сақталатын процедуралар қолданушы деректер қорында орналасады.

Уақытша сақталатын процедуралардың аттары # немесе ## символымен басталады. # символымен басталатын процедуралар уақытша жергілікті процедуралар болады, сонымен қатар, оларға қатынауға болады егер осы қосылыста жасалса. Қосылысты жапқанда процедура автоматты түрде жойылады. ## екі символымен басталатын процедуралар уақытша аумақты процедуралар болады және оларға берілген сервермен кез келген жұмысында қатынауға болады.

Өшірілген сақталатын процедураларды серверден шақыруға болады. Бірақ ағымды сервер аралық звеноның рөлін ойнайды. Сонымен қатар, өшірілген сақталатын процедураны ол орналасқан серверден де шақыруға болады.

Сақталатын процедуралардың тағы бір типі бар: кеңейтілген сақталатын процедуралар (extended stored procedures). Олар С сияқты программалау тілінде жазылады. Кеңейтілген сақталатын процедуралар динамикалық байланыстар кітапхана – DLL (Dinamic Link Library) құрамындағы функциялар сияқты бейнеленеді. Кеңейтілген сақталатын процедуралардың аттары xp_ символымен басталады.

Сақталатын процедураларда 1024 параметрлер болу мүмкін. Әр параметрді анықтау келесі түрде жүргізіледі:



@параметр_атауы мәліметтер_типі

Параметр атауы @ символымен басталу керек. Бұл символдан кейін Unicode кез келген әріптері, @, $, # және _ цифрлары мен символдары жалғасу керек.

Сақталатын процедураларда RETURN инструкциясы қолданылуы мүмкін. Ол процедура орындауын тоқтатады, ал инструкцияға жағдай кодын интерпретациялайды.

Сақталатын процедуралардағы барлық жергілікті айнымалылар олардың қолданылуына дейін хабарлану керек. Осы процедураның шектерінде ерекше аттар болу керек. Айнымалының көріну аймағы оның хабарлануына дейін кодтың барлық жолдарына таратылады.

Хабарламаның нысаны параметрді хабарлау нысанына ұқсас:

DECLARE @айнымалы_атауы мәліметтер_типі

Айнымалы не параметрге мәнді меншіктеу үшін SET инструкциясы қолданылады.

2. Курсордың қолдануы


Курсор – бұл ерекше уақытша SQL объектісі, бағдарламаларда және сақталған процедураларда қолдану үшін арналған. Оның көмегімен циклда жолдарды сұрау, олардың әр жолын жеке-жеке ескеріп отыруға болады. Курсордың көмегімен сақталған процедуралардан SELECT инструкциясының синтаксисі арқылы шығарылатын күрделі есептеулерді орындауға болады. Сонымен қатар, жаңартылған курсорлар таңдамалы жаңарту және нәтиже беретін кестелер жолдарының сұранысын өшіруге болады. Курсормен жұмыс бес әрекеттен тұрады:

Курсорды хабарлаңыз.

OPEN инструкциясының көмегімен курсорды ашыңыз..

FETCH көмегімен курсордың әр жолын циклда рет-ретімен оқыңыз.

Қисынға сәйкес процедураны жаңартыңыз немесе өшіріңіз.

CLOSE инструкциясы көмегімен курсорды жабыңыз.

Егер, курсор сізге керек емес болса, онда DEALLOCATE инструкциясы көмегімен курсорды босатыңыз.

3. Триггерлер


Триггерлер сақталған процедуралардың әр түрлілігін қамтиды. Тригерлермен байланысқан кестелерді өзгерткен уақытта автоматты түрде іске қосылады. Анықталған кестелерді қойылу кезінде, олардың берілгенін өшіргенде немесе модификациялағанда, триггер – автоматты түрде іске қосылады.

Көбінесе триггерлер деректер базасының күрделі критерийлерінде қолданылады, егер стандартты шектемелер жетіспегенде және кестелік қажеттіліктердің берілгендері толық жабдықталса.

Триггер және Transact-SQL сұраныс операторы бірыңғай транзауция сияқты қаралады, триггерден өзгерту арқылы. Әдетте триггердің құрамына орындалу командалардың тобы немесе белгілі бір шартты тексеру кіреді.Деректерді өңдеу мүмкін емес жағдайда немесе шарт орындалмау кезінде транзакция итеріледі.

Триггерді жасау тек мәліметтер базасының иесіне ғана мүмкін. Бұл шектеу, кестелердің құрамының кенеттен өзгермеуінен және олардың басқа объекттермен қатынасын сақтайды.

Триггерді құру үшін келесі форматтағы CREATE операторы қолданылады:

CREATE TRIGGER [иесі.]триггердің аты

ON [иесі.]кестенің_аты

FOR {INSERT, UPDATE,DELETE}

[WITH ENCRYPTION]

AS

< оператор_SQL>

Бұл жерде кілттік сөз INSERT (Вставить), UPDATE (Обновить), DELETE (Удалить) триггердің орындалу операцияларын анықтайды. WITH ENCRYPTION (с шифрованием) параметрі тексті оқу мүмкіндігін береді. SQL Server триггердің текстін syscomments жүйелік каталогының кестесінде сақтайды..

Қою және Жаңарту триггерлері кестені енгізген кезде ссылканың бүтіндігінің шартын және мәліметтердің дұрыстығын қолдайды. Әдетте, қажет етілген критерийге сәйкес келетін анықталған бағандардың мәліметтерін тексеру үшін қолданылады. Триггерлерді тексеру критерийі өте қиын болған жағдайда ғана қолданған дұрыс.

Іnserted кестесі құрамына әр жолдың көшірмесі транзакцияның сәтті аяқталуы кезінде ғана қосылады. Бұл кесте және оның мәні транзакцияның дұрыстығын тексерудегі кез-келген операцияны салыстыру үшін қолданылады. Inserted кестесінің бағаны жұмыс кестесінің бағандарымен туп-тура сәйкес келеді.

Мысалы: Predp ( предприятие ) және tovar ( товар ) екі кестесі берілсін. Ол cod ( код предприятия ) жолына қатысты «біреуі көбіне». Кестеге қосу tovar бір жағдайда ғана мүмкін болады, егер ол ата-аналар кестесінде бар болса. Қою триггері tovar кестесі үшін, мына түрде беріледі:

CREATE TRIGGER add_tovar

ON tovar


FOR INSERT

AS

IF (NOT EXISTS(SELECT a.cod FROM predpr a, inserted b WHERE a.cod = b.cod))



BEGIN

ROLLBACK TRAN

RAISERROR('осы кодпен берілген мекекеме жұмыс істемейді', 16,10)

END


Өшіру триггері, әдетте, мына жағдайда қолданылады:

- жолдарды өшіру көбінесе кестенің бүтіндігіне кедергісін келтіруі мүмкін. Мысалы, басқа кестелер бойынша сыртқы кілт ретінде қолданылатын жолдар;

- негізгі жолдарының туынды жолдарын өшіру, каскадтық операцияларды орындау.

Өшіру триггерін құрған кезде өшіру командасы бірнеше кестенің жолдарын есте сақтаған жөн.

Deleted кестесі әр жолдың көшірмесінен тұрады. Бұл кесте және оның мәні транзакцияның дұрыстығын тексеруге арналған кез-келген теңестіру үшін пайдаланылады. Deletedи кестесінің бағаны жұмыс кестесінің бағанымен сәйкес келеді.

Келесі мысалда Өшіру триггеріне арналған. PREDP кестесі бір жолдан көп өшіреді:

CREATE TRIGGER del_predp

ON predp


FOR DELETE

AS

IF @@ROWCOUNT > 1



BEGIN

ROLLBACK TRAN

RAISERROR (‘бір рет бір жолды өшіруге болады’,16,10)

END


IF EXISTS(SELECT * FROM tovar a, deleted b WHERE a.cod = b.cod)

BEGIN


ROLLBACK TRAN

RAISERROR (‘записті өшіруге болмайды’,16,10)

END

4. Қателер туралы мәліметтерді хабарлау.


Егер сақталған процедураларды орындау барысында қателер туралы мәліметтерді хабарлау керек болса, онда бұл хабарды RAISERROR инструкциясы арқылы орындауға болады..

RAISERROR инструкциясының базалық синтаксисі мынадай:


RAISERROR( хабар, қалпы, мәндер параметрлері1, … )

Хабарлау хатының жолдарының ұзындығы 8000 символдан тұруы мүмкін және 20-ға дейінгі параметрлері қосылады. Қосылу параметрлерінің спецификациясы % символдан басталады. Символдық параметрлер %s белгіленеді, ал бүтін сандар %d.

Хабарлау хатының мәні ретінде литералдарды енгізуге болады. Сіз берген мән хатқа енгізіледі де, бұл хабарлау шақырылған программаға жіберіледі.
Дәріс 7. Транзакциялар және құлыпталу.

Жоспар:

1. Транзакция және құлыпталу туралы түсінік, олардың арасындағы байланыс.

2. Транзакциялармен басқару

3. Құлыптауларды басқару.



1. Транзакция және құлыпталу туралы түсінік, олардың арасындағы байланыс.


Бір уақытта бірнеше қолданушылар бір деректер базасымен жұмыс істейтін кездер болады. Сондай кезде бір қолданушы мәліметтергше өзгеріс енгізген жағдайда, басқа қолданышуларда кейбір әрекеттер дұрыс жұмыс жасамауы мүмкін. Мұндай қиындықтар тумас үшін SQL Server транзакция және құлыптау механизмі түсініктерін енгізді.

Транзакция – бұл Transact-SQL командасының реттелген жиынтығы. Бүтіндей орындалатын қисынды аяқталу блогы. Транзакцияда командалар саны шектелмеген және ол әрі қарай жұмыс істей береді. Тек транзакцияны итергенде ғана орындалмайды. Мұндай жағдайда жүйе қалпына келтіріліп барып, басынан бастап жұмыс жасалады. Жүйенің алғашқы қалпы туралы мәлімет транзакцияның журналында сақталған. Транзакцияға қосылған командалар жиыны келесі міндетті қанағаттандыру қажет:



  1. атомарность – транзакцияға қосылған командалар блогы тек тұтастай ғана орындалады немесе орындалмайды;

  2. келісім – транзакция орындалып болғаннан кейін, барлық мәліметтер келісім қалпында болу керек;

  3. шектеу – орындалып жатқан транзакцияның мәліметтерін өзгерту басқа транзакциялардың өзгеруіне қатысты болмайды, яғни әр түрлі өзгерістегі транзакцияларға шектеу қойылады. Транзакция мәліметтерді жұмысты бастамас бұрын қарайды немесе жұмыс аяқталғаннансоң көреді. Бір транзакция басқа транзакцияның өзгерткен мәліметін көрмейді.

  4. Тұрақтылық - транзакция аяқталғаннан кейін, жүйеде сақталынады және оны қайтадан қалыпқа келтіре алмайсың.

SQL Server өзіне құлып салады және оған басқа транзакциялардың

құқығы болмайды.Соңғы транзакция аяқталғаннан кейін ғана басқаларына мәліметтері қол жетеді. Программист бір транзакция ретінде қандай командалар орындалу керек екенін анықтап алуы қажет. Кейбір құлыптау режимдері көп мөлшерде қолданушыларды қабылдамайды. Сол себепті жүйедегі бір келісімді қалыптан екіншісіне өтетін транзакциядағы командалар барынша аз болады.

Құлыпталу (блокировка) – бұл уақытша жанама шектеу. Құлыптау кестенің бір жолына ғана салынуы мүмкін. Құлыптауды басқарумен оның менеджері айналысады. Транзакция жұмыс жасап жатқан кезде ол автоматты түрде қосылып тұрады және керек кезде зонаның көлемін кеңейтеді. Бір мезгілде бір мәліметке бірнеше қолданушылар үшін, келесі төрт мәселе қаралады:


  1. Проблема туындайды, егер бірнеше транзакциялар бір жолды барлық жерде өзгерткен болса. Берілгеннің бір бөлігі жоғалады, себебі транзакция алдында орындалған транзакцияның мәліметін көшіріп отырады.

  2. «нашар» оқу проблемасы туындайды, егер бір транзакция қиын мәліметтерде көп өзгерістерді қажет ететін өңдеу операцияларын орындап жатса. Оның алдында берілген мәліметтер қисынды қалыпта болады. Егер осы уақытта екінші транзакция мәліметтерді санаса, онда дұрыс емес қисынды ақпаратты алуға болады.

  3. Қайталап оқылмайтын проблемасы туындайды, егер бірінші транзакция бір мәліметті бірнеше рет оқыса, ал екінші транзакция осы уақытта оған өзгертулер енгізіп жатса. Сонда бірінші транзакция қайталап оқығанда басқа мәліметтерді оқиды. Бұл жағдайда бірінші транзакцияның мәні актуалды болмайды және олардың негізіндегі жолдарды өзгерту қисынды келісілген мәліметтердің бұзылуына әкеліп соғады.

  4. «фантома» проблемасы – туындайды, егер бірінші транзакция кестеден мәліметтерді таңдаса, ал басқа транзация бірінші транзакцияның аяқталуына дейін жаңа жолдарды қояды.



2. Транзакциялармен басқару


SQL Server үш басқару транзакцияларымен қамтылады: анық, автоматты және ұқсас.

Анық транзакциялар қолданушылардың транзакцияның басы мен аяғын анық көрсеткенін қажет етеді. Transact SQL командасын орындау арқылы. Анық транзакцияларды басқару мына командалар түрінде қолданылады:

BEGIN TRAN[SACTION] [<транзакция аты>]

@ <ауыстыру аты>



<транзакция аты> деген жерде транзакция аты қолданылады, <ауыстыру аты> ауыстыру атын береді. Бір код қолдана отырып бірнеше транзакцияны жасауға болады.

COMMIT [WORK]

COMMIT [TRAN[SACTION] [<транзакция аты >]

@ <ауыстыру аты>

Транзакцияның аяғы, егер транзакция денесінде қате болмаса, онда ол команда барлық өзгерістерді серверге тіркейді. Транзакцияда істелінген барлық жұмыстар оның журналында сақталады.

ROLLBACK [WORK]

ROLLBACK [TRAN[SACTION] [<транзакция аты >]

@ <ауыстыру аты>

Транзакцияны жылжыту транзакцияны тоқтату үшін және бастапқы қалпына келтіру үшін қолданады.

Автоматтық транзакция SQL Serverінде үнсіз қойылымда орнатылады. Бұл режимде әр команда жеке транзакция ретінде қаралады, яғни команда дұрыс аяқталса онда оның өзгерістері тіркеледі, кері жағдайда жүйе алғашқы қалпына келеді. Транзакция тапсырмасы анық режимі бір бүтін команда бірнеше рет қолданылады. Автоматты және анық емес басталу транзакциясы негізге режимі болып табылады және сервер осы режимдердің біреуінде болады. Анық басталу транзакция режимі басқа екі режим үстімен жұмыс істейді. Автоматты басталу транзакциясының орнату үшін Transact-SQL команда тілі орындалады:

SET IMPLICIT_TRANSACTION OFF

Анық емес транзакциялар (подразумеваемые). Режимде жұмыс істеу кезінде анық емес басталу транзакцияларында сервер жаңа транзакцияны алдындағысы аяқталысымен бастайды. Транзакция аяқталды деп есептелінеді, егер ROLLBACK TRAN, COMMIT TRAN командалары кездессе. ALTER TABLE – кестенің құрылымын өзгерту, CREATE – мәліметтер базасының объектісін құру, DELETE – берілген кестеден жолдың өшірілуі, DROP – мәліметтер базасының объектілерін өшіру, FETCH – курсордың колонкаларынан алынып тастау, GRANT – объектер базасына өтуге рұқсат беру, INSERT – жолдың кестеге қосылуы, OPEN – курсордың ашылуы, SELECT – деректер таңдау, UPDATE – кестенің берілгенін өзгерту.

Анық емес режимді орнату үшін мына команда Transact-SQL орындалады:

SET IMPLICIT_TRANSACTION ON


3. Құлыптауларды басқару.


Орнату туралы барлық жұмыстарды арнайы серверде анықталған менеджермен анықталады. Транзакциялармен автоматты режим түрінде үнсіз қойылым типі түріндегі жұмысты жасайды. Бұл жағдайда қандай құлып керек екенін анық көрсетуге болады.Транзакцияны орындаудың алдында сәйкес келетін құлыптау сұралады. Бұны менеджер шешеді. Кейде, егер керекті ресурс құлыптау менеджерімен бос болмаса, онда сұранысты тоқтатады немесе оны кезекке қояды және оны орындайды.Осыдан кейін ғана қажет етілген ресурс құлыптаудан босатылады. Ресурстың құлыптауынан босауды күту уақыты анық келесі командалармен орындалады:

SET LOCK_TIME OUT <уақыт>

Уақыт деген жерде миллисекунд саны беріледі, ол ресурстың құлыптауынан босауды күту уақытында.

Қолданушы барынша тез орындалатын доступқа ие бола алады. Кейде басқа қолданушылар кестенің берілгеніне қол жеткізе алмайды, себебі транзакция әлі аяқталып болған жоқ.

SQL Server келесі құлыптаулардың түрлерін береді:


  1. RID – жол деңгейіндегі құлыптау;

  2. KEY – индекс деңгейіндегі құлыптау, мәліметтер транзакциясындағы өзгерістерге сәйкес келеді;

  3. PAGE – бет деңгейіндегі құлыптау;

  4. EXTERN –extern(а) деңгейіндегі құлыптау;

  5. Table – кесте деңгейіндегі құлыптау;

  6. DB – мәліметтер базасы деңгейіндегі құлыптау.

Изоляция деңгейі:

1)READ UNCOMMITED – аяқталмай қалған оқу, төменгі деңгей изоляцияның тек мәліметтердің бүтіндігін ғана қамтамасыз етеді. Ол үшін изоляцияға анық команда беру керек:

SET TRANSACTION ISOLATION LEVEL

READ UNCOMMITED

2) READ COMMITED – аяқталған оқу еш кедергісіз болады, ол үшін сервер ұжымдық құлыптауды қолданады. Изоляцияның берілген деңгейі үнсіз қойылымда болады. Ол үшін изоляцияға анық команда беру керек:

SET TRANSACTION ISOLATION LEVEL

READ COMMITED

3) REPEATABLE READ – қайталап оқу, бұл қайталап оқымау мәселесін шешеді. Ол үшін, монопольды құлыптау қолданылады. Ол үшін изоляцияға анық команда беру керек:

SET TRANSACTION ISOLATION LEVEL

REPEATABLE READ

4) SERIALIZABLE – бөліктеу, изоляцияның ең жоғарғы деңгейі болып табылады, барлық мәселелерді шешеді. Ол үшін мына команда орындалады:

SET TRANSACTION ISOLATION LEVEL

SERIALIZABLE

SET TRANSACTION ISOLATION LEVEL орнату изоляциясы деңгейін арнайы кілттік сөздер арқылы шешуге болады.



Каталог: ebook -> umkd
umkd -> Ќазаќстан республикасыныњ білім жєне ѓылым министірлігі
umkd -> Ќазаќстан Республикасы Білім жєне ѓылым министрлігі
umkd -> Бағдарламасы «Мектептегі атыс дайындығы»
umkd -> Семей мемлекеттік педагогикалыќ институты
umkd -> «Кәсіптік қазақ тілі» ПӘнінің ОҚУ-Әдістемелік кешені
umkd -> Ќазаќстан республикасыныѕ білім жјне єылым министірлігі
umkd -> Ќазаќстан республикасы
umkd -> «Инженерлік-технологиялыќ факультеттіњ»
umkd -> Ќазаќстан республикасыныњ білім жєне ѓылым министрлігі
umkd -> «Таңдап алған спорт түрінің техникалық, тактикалық және дене дайындығы» пәні бойынша


Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   10   11


©kzref.org 2019
әкімшілігінің қараңыз

    Басты бет