RETURN COALESCE (@TEK_Count, ())
Енді осы рəсімді шақырамыз, ол ҥшін рəсімді орындау нəтижелерін
орналастыруға болатын ауыспалыны дайындаймыз:
declare @N int
@N ауыспалыда ағымдағы жылы «АКАДЕМИЯ» баспасы басып
шығарған, кітапханада бар кітап санын аламыз. Біз барлық
параметрлерді белгілей отырып, осы рəсімге қайта орала аламыз:
EXEC @N = COUNT_BOOKS @PUBLICH = 'АКАДЕМИЯ',
@YEARIZD = 2004
Сонда 2014 ж. «АКАДЕМИЯ» баспасымен басып шығарылған жəне
біздің кітапханамызда бар кітап санын аламыз.
Егер біз параметрлерді аттары бойынша белгілейтін болсақ, онда
рəсімді жасау кезінде сипатталған тəртіппен белгілеу міндетті емес.
Әрбір сақталатын рəсім ДҚ объектісі болып табылады. Жҥйелік
каталогта оның бірегей аты мен бірегей ішкі нөмірі бар. Біз сақталатын
рəсімнің мəтінін өзгерту кезінде алдымен осы рəсімді ДҚ-да
сақталатын объект ретінде жоюымыз керек жəне содан кейін ғана оның
орнына жаңасын жазуымыз керек. Сақталатын рəсімді жою кезінде сол
уақытта оның барлық нҧсқасы жойылатынын атап өткен жөн.
Ескі рəсімді жою жəне оны жаңасына ауыстыру ҥрдісін
автоматтандыру ҥшін, сақталатын рəсім мəтінінің басында жҥйелік
каталогта осындай аты бар ―сақталатын рəсім‖ типті объекттің болуын
тексеруге болады жəне осы объекттің сипаттамасы болған жағдайда
оны жҥйелік каталогтан жою керек. Бҧл жағдайда сақталатын рəсімнің
мəтіні арнайы тексеру операторымен ескертіледі жəне мысалға, келесі
тҥрде болуы мҥмкін:
/* жҥйелік каталогта осындай аты жəне ДҚ иесі жасаған типті
объекттің болуын тексеру */
IF exists (select * from sysobjects where id = object_id
('dbo.NEW_BOOKS') and systant & Oxf = 4)
/* егер объект болса, онда оны алдымен жҥйелік каталогтан
жоямыз*/
drop procedure dbo.NEW_BOOKS
GO
CREATE PROCEDURE NEW_BOOKS (@ISBN varchar (12).@TITL
varchar (255),@AUTOR varchar (30).@COAUTOR varchar (30).@
YEARIZD int. @PAGES INT,@NUM_EXEMPL INT)
/* осы кітаптың дана саны көрсетілген жаңа кітапты енгізу рəсімі
Параметрлер
@ISBN
@TITL
@AUTOR
@COAUTOR
@YEARIZD
@PAGES
@NUM_EXEMPL
AS
varchar (12) — кітап шифрі
varchar(255) — атауы
varchar(30) — автор
varchar(30) — бірлескен автор
int
int
int
— басып шығарылған жылы
— бет саны
— дана саны */
/*қалған
кіріске
алынбаған,
яғни
инвентарлы
нөмірлер
тағайындалмаған кітап данасының саны сақталатын ауыспалыны
сипаттаймыз */
/DECLARE @ТЕК int
/ *кітап туралы деректерді BOOKS кестесіне енгіземіз*/
INSERT INTO BOOKS VALUES @ISBN. @TITL. @AUTOR.
@COAUTOR.@YEARIZD@PAGES)
/* қалған енгізілуі қажет дана санының ағымдағы есептегіш мəнін
тағайындау /
SELECT @ТЕК = @NUM_EXEMPL
/* осы кітаптың жаңа данасын енгізу ҥшін циклді ҧйымдастырамыз
*/ WHILE @TEK>0 /* қалған дана саны нөлден артық */
/* кітап данасының инвентарлы нөмірі ҥшін IDENTITY қасиетін
белгілегендіктен, инвентарлы нөмірді енгізу қажет емес. СУБД бҧдан
бҧрынғыға бір бірлікті қосып, оны автоматты тҥрде есептейді, INSERT
енгізу операторын орындау кезінде енгізеді.
Кітапханадағы дананың барын айқындайтын ая (EXIST), —
логикалық ая; біз онда кітапханадағы бар кітап данасына сəйкес
келетін TRUE мəнін енгіземіз */
INSERT into EXEMPLAR (ISBN.DATA_IN. DATA_OUT. EXIST)
VALUES (@ISBN.GetDate ().GetDate ()).TRUE)
/* қалған дана санын есептегіштің ағымдағы мəнін өзгерту */
SELECT @ТЕК = @ТЕК - 1
END /* кітап данасы туралы деректерді енгізу циклінің соңы */
Егер біз дананың инвентарлы нөмірі ретін инкрементті аяны
пайдаланбасақ, кітапханада сақталатын соңғы кітап данасының нөмірін
бір бірлікке арттыра отырып, инвентарлы нөмірді өзіміз тағайындау
алушы едік. Кітапханада бар дана санын есептеуге болатын еді, бірақ
біз кейбіреулерін жойып алар едік. Сонда жаңа дананың нөмірі
əлдеқайда пайдаланылуы мҥмкін жəне біз деректерді енгізе алмаймыз,
жҥйе бастапқы кілттің бірегейлігін бҧзу мҥмкіндігін бермейді.
BEGIN
GO
Бҧл жағдайда рəсімнің мəтіні төмендегідей болады:
/* жҥйелік каталогта ДҚ иесі жасап шығарған, осындай аты мен
тҥрі бар объекттің болуын тексеру */
if exists (select * from sysobjects where id = object_id('dbo.
NEW_BOOKS') and sysstat & Oxf = 4)
/* егер объект болса, онда алдымен оны жҥйелік каталогтан
жоямыз*/
drop procedure dbo. NEW_BOOKS
CREATE PROCEDURE NEW_BOOKS (@ISBN varchar (12).@TITL
varchar (255),@AUTOR varchar (30).@CoAuTOR varchar (30).@
YEARIZD int. @PAGES INT,@NUM_EXEMPL INT)
/* осы кітаптың дана саны көрсетілген жаңа кітапты енгізу рəсімі
Параметрлер
@ISBN
@TITL
@AUTOR
@COAUTOR
@YEARIZD
@PAGES
@NUM EXEMPL
varchar (12)
varchar(255)
varchar(30)
varchar(30)
int
int
int
кітаптың шифрі
атауы
автор
бірлескен автор
шығарылған жылы
бет саны
дана саны */
*/
DECLARE @TEK int
DECLARE @INV int
INSERT INTO BOOKS VALUES (@ISBN.@TITL.@AUTOR.
@COAUTOR.@YEARIZD.@PAGES)
/* қалған енгізілуі қажет дана санының ағымдағы есептегіш мəнін
тағайындау */
SELECT @ТЕК = @NUM EXEMPL
/* кітапханадағы инвентарлы нөмірдің ең жоғарғы мəнін айқындау
*/
SELECT @INV = SELECT MAX (ID_XEMPLAR)
FROM EXEMPLAR
/* осы кітаптың жаңа данасын енгізу ҥшін циклді ҧйымдастырамыз
*/
WHILE @ТЕК>0
/* қалған дана саны нөлден артық */ BEGIN
insert
into
EXEMPLAR
(ID_XEMPLAR.ISBN.DATA_IN.
DATA_OUT.EXIST)
VALUES ((@INV.(@ISBN.GETDATE (). GETDATE (), TRUE) /*
есептегіш пен инвентарлы нөмірді есептегіштің ағымдағы мəндерін
өзгерту */
Достарыңызбен бөлісу: |