8

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
USE master;
GO
IF db_id (N'Bank') IS NOT NULL
DROP DATABASE Bank;
GO
CREATE DATABASE Bank
ON (NAME = Bank_dat, FILENAME = 'C:\data\Bankdat.mdf',
SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB)
LOG ON (NAME = Bank_log, FILENAME = 'C:\data\Banklog.ldf',
SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB);
GO
USE Bank;
GO
CREATE TABLE Person (ID_P uniqueidentifier PRIMARY KEY ROWGUIDCOL DEFAULT (newid()),
firstname char(50),
secondname char(50));
GO
INSERT Person (firstname, secondname) VALUES ('Jack', 'Green');
INSERT Person (firstname, secondname) VALUES ('Homer', 'Simpson');
INSERT Person (firstname, secondname) VALUES ('Kate', 'Ostin');
INSERT Person (firstname, secondname) VALUES ('Gabriel', 'Cost');
INSERT Person (firstname, secondname) VALUES ('Tina', 'Gamp');
INSERT Person (firstname, secondname) VALUES ('Steve', 'Duck');
INSERT Person (firstname, secondname) VALUES ('Steve', 'Black');
GO
/*
Создать хранимую процедуру, производящую
выборку из некоторой таблицы и возвращающую
результат выборки в виде курсора.
*/
IF OBJECT_ID ( 'currency_cursor', 'P' ) IS NOT NULL
DROP PROCEDURE currency_cursor;
GO
CREATE PROCEDURE currency_cursor @currency_cursor CURSOR VARYING OUTPUT AS
SET @currency_cursor = CURSOR FORWARD_ONLY STATIC FOR
SELECT * FROM Person WHERE firstname NOT IN ('Steve');
OPEN @currency_cursor;
GO
DECLARE @MyCursor CURSOR;
EXEC currency_cursor @currency_cursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO
/*
Модифицировать хранимую процедуру п.1. таким
образом, чтобы выборка осуществлялась с
формированием столбца, значение которого
формируется пользовательской функцией.
*/
IF OBJECT_ID (N'func', N'FN') IS NOT NULL
DROP FUNCTION func;
GO
CREATE FUNCTION func (@word char(50)) RETURNS int AS
BEGIN
RETURN LEN (@word)
END;
GO
IF OBJECT_ID ( 'currency_cursor1', 'P' ) IS NOT NULL
DROP PROCEDURE currency_cursor1;
GO
CREATE PROCEDURE currency_cursor1 @currency_cursor1 CURSOR VARYING OUTPUT AS
SET @currency_cursor1 = CURSOR FORWARD_ONLY STATIC FOR
SELECT * , lengthname = dbo.func(Person.firstname) FROM Person WHERE firstname NOT IN ('Steve');
OPEN @currency_cursor1;
GO
DECLARE @MyCursor CURSOR;
EXEC currency_cursor1 @currency_cursor1 = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO
/*
Создать хранимую процедуру, вызывающую
процедуру п.1., осуществляющую прокрутку
возвращаемого курсора и выводящую сообщения,
сформированные из записей при выполнении
условия, заданного еще одной пользовательской
функцией.
*/
IF OBJECT_ID (N'func1', N'FN') IS NOT NULL
DROP FUNCTION func1;
GO
CREATE FUNCTION func1 (@a char(50)) RETURNS char(50)
BEGIN
DECLARE @name char(50);
IF (LEN(@a) = 4) SET @name = @a
ELSE SET @name = 'no4';
RETURN @name;
END;
GO
IF OBJECT_ID ( 'currency_cursor2', 'P' ) IS NOT NULL
DROP PROCEDURE currency_cursor2;
GO
CREATE PROCEDURE currency_cursor2 AS
DECLARE @MyCursor CURSOR;
DECLARE @id uniqueidentifier;
DECLARE @name char(50);
DECLARE @lastname char(50)
EXEC currency_cursor @currency_cursor = @MyCursor OUTPUT;
FETCH NEXT FROM @MyCursor INTO @id, @name, @lastname;
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (dbo.func1(@name) = 'no4') PRINT @name;
FETCH NEXT FROM @MyCursor INTO @id, @name, @lastname;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO
EXECUTE currency_cursor2;
GO
SELECT * FROM Person;
GO
/*
Модифицировать хранимую процедуру п.2. таким
образом, чтобы выборка формировалась с помощью
табличной функции.
*/
CREATE FUNCTION func2 () RETURNS table
AS RETURN (SELECT dbo.Person.ID_P, .Person.firstname FROM Bank.dbo.Person);
GO
IF OBJECT_ID ( 'currency_cursor3', 'P' ) IS NOT NULL
DROP PROCEDURE currency_cursor3;
GO
CREATE PROCEDURE currency_cursor3 @currency_cursor3 CURSOR VARYING OUTPUT AS
SET @currency_cursor3 = CURSOR FORWARD_ONLY STATIC FOR
SELECT * FROM dbo.func2() WHERE firstname NOT IN ('Steve');
OPEN @currency_cursor3;
GO
DECLARE @MyCursor CURSOR;
EXEC currency_cursor3 @currency_cursor3 = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO