Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Использование типа данных cursor в параметре OUTPUT




Хранимые процедуры языка Transact-SQL могут использовать тип данных cursor только для параметров OUTPUT. Если тип данных cursor указан для параметра, должны быть также указаны оба параметра VARYING и OUTPUT. Если для параметра указано ключевое слово VARYING, тип данных должен быть cursor и должно быть указано ключевое слово OUTPUT.

Примечание: Тип данных cursor не может быть связан с переменными приложения через интерфейсы API баз данных, таких как OLE DB, ODBC, ADO и DB-Library. Поскольку параметры OUTPUT должны быть связаны прежде, чем приложение может выполнить хранимую процедуру, хранимые процедуры с параметрами OUTPUT типа cursor не могут быть вызваны из функций API базы данных. Эти процедуры могут быть вызваны из пакетов языка Transact-SQL, хранимых процедур или триггеров, только когда переменная OUTPUT типа cursor присвоена локальной переменной языка Transact-SQL типа cursor.

 

Следующие правила относятся к выходным параметрам типа cursor при выполнении процедуры:

1. Для однонаправленного курсора в результирующий набор курсора будут возвращены только строки с текущей позиции курсора до конца курсора. Текущая позиция курсора определяется при окончании выполнения хранимой процедуры.

Например:

Непрокручиваемый курсор открыт в процедуре на результирующем наборе по имени RS из 100 строк.

Процедура выбирает первые 5 строк результирующего набора RS.

Процедура возвращает результат участнику.

Результирующий набор RS, возвращенный участнику, состоит из строк с 6 по 100 из набора RS, и курсор в участнике позиционирован перед первой строкой RS.

2. Для однонаправленного курсора, если курсор позиционирован перед первой строкой после завершения хранимой процедуры, весь результирующий набор будет возвращен к вызывающему пакету, хранимой процедуре или триггеру. После возврата позиция курсора будет установлена перед первой строкой.

Для однонаправленного курсора, если курсор позиционирован за концом последней строки после завершения хранимой процедуры, вызывающему пакету, хранимой процедуре или триггеру будет возвращен пустой результирующий набор.

4. Для прокручиваемого курсора, все строки в результирующем наборе будут возвращены к вызывающему пакету, хранимой процедуре или триггеру после выполнения хранимой процедуры. При возврате позиция курсора остается в позиции последней выборки, выполненной в процедуре.

5. Для любого типа курсора, если курсор закрыт, то вызывающему пакету, хранимой процедуре или триггеру будет возвращено значение NULL. Это же произойдет в случае, если курсор присвоен параметру, но этот курсор никогда не открывался.

Примечание. Закрытое состояние имеет значение только во время возврата. Например, можно при выполнении процедуры закрыть курсор, снова открыть его позже в процедуре и возвратить этот результирующий набор курсора в вызывающий пакет, хранимую процедуру или триггер.

 

Пример:

В следующем примере создается хранимая процедура, которая указывает выходной параметр @currency_cursor, используя тип данных cursor. Хранимая процедура затем будет вызвана из пакета.

Создание и заполнение таблицы для примера:

IF OBJECT_ID ('Table1', N'U') IS NOT NULL

DROP TABLE Table1;

GO

CREATE TABLE Table1

(c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);

GO

INSERT INTO Table1 VALUES (1, 10);

INSERT INTO Table1 VALUES (2, 20);

INSERT INTO Table1 VALUES (3, 30);

GO

select * from Table1

Создание процедуры:

IF OBJECT_ID ('PrimerCursor', 'P') IS NOT NULL

DROP PROCEDURE PrimerCursor;

GO

CREATE PROCEDURE PrimerCursor

@CurrencyCursor CURSOR VARYING OUTPUT

AS

SET NOCOUNT ON;

SET @CurrencyCursor = CURSOR

STATIC FORWARD_ONLY FOR

select c1, c2 from Table1

OPEN @CurrencyCursor;

GO

 

Обращение к процедуре:

DECLARE @MyCursor CURSOR;

EXEC PrimerCursor @CurrencyCursor = @MyCursor OUTPUT;

--обратите внимание на синтаксис, @CurrencyCursor = @MyCursor

WHILE (@@FETCH_STATUS = 0)

BEGIN

FETCH NEXT FROM @MyCursor

END;

CLOSE @MyCursor;

DEALLOCATE @MyCursor;

GO

 

Результат:

 

См. выше. Для однонаправленного курсора, если курсор позиционирован перед первой строкой после завершения хранимой процедуры, весь результирующий набор будет возвращен к вызывающему пакету, хранимой процедуре или триггеру. После возврата позиция курсора будет установлена перед первой строкой.

Измененный пример:

IF OBJECT_ID ('PrimerCursor', 'P') IS NOT NULL

DROP PROCEDURE PrimerCursor;

GO

CREATE PROCEDURE PrimerCursor

@CurrencyCursor CURSOR VARYING OUTPUT

AS

SET NOCOUNT ON;

SET @CurrencyCursor = CURSOR

STATIC SCROLL FOR

select c1, c2 from Table1

OPEN @CurrencyCursor;

FETCH ABSOLUTE 2 FROM @CurrencyCursor

FETCH prior FROM @CurrencyCursor

GO

--Обращение к процедуре:

DECLARE @MyCursor CURSOR;

EXEC PrimerCursor @CurrencyCursor = @MyCursor OUTPUT;

FETCH NEXT FROM @MyCursor

CLOSE @MyCursor;

DEALLOCATE @MyCursor;

GO

Результат:

 

См. выше. Для прокручиваемого курсора, все строки в результирующем наборе будут возвращены к вызывающему пакету, хранимой процедуре или триггеру после выполнения хранимой процедуры. При возврате позиция курсора остается в позиции последней выборки, выполненной в процедуре.

Пример:

--Создание процедуры с выходным параметром курсором

USE AdventureWorks;

GO

IF OBJECT_ID ('dbo.uspCurrencyCursor', 'P') IS NOT NULL

DROP PROCEDURE dbo.uspCurrencyCursor;

GO

CREATE PROCEDURE dbo.uspCurrencyCursor

@CurrencyCursor CURSOR VARYING OUTPUT

AS

SET NOCOUNT ON;

SET @CurrencyCursor = CURSOR

FORWARD_ONLY DYNAMIC FOR

SELECT CurrencyCode, Name

FROM Sales.Currency where Name Like 'S%';

OPEN @CurrencyCursor;

GO

 

Вызов процедуры:

USE AdventureWorks;

GO

DECLARE @MyCursor CURSOR;

EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;

WHILE (@@FETCH_STATUS = 0)

BEGIN;

FETCH NEXT FROM @MyCursor;

END;

CLOSE @MyCursor;

DEALLOCATE @MyCursor;

GO

Результат:

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...