Использование типа данных 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 Результат:
Читайте также: DML. Изменение данных Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|