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