Программирование на T-SQL. Хранимые процедуры. Создание хранимых процедур. Переменные, параметры и коды возврата, страница 5

-- Указание по имени

EXEC <stored procedure> @parml=<value>, @parm2=<value>, ...

--Указание по позиции

EXEC  <stored procedure> <value>,   <value>,   ...

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

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

Пример 2.15.

Способы запуска процедуры ProcMax (см. пример 2.9)

 ProcMax 21, 3, 6

EXEC ProcMax @a=1, @b=3

Для применения выходных параметров следом за каждым из них необходимо указывать ключевое слово OUT или OUTPUT.

-- Применение выходных параметров 

DECLARE  @variablel    <data  type>, 

          @variable2    <data  type>

...         

EXEC <stored procedure> @parameterl, @variablel OUTPUT, @variable2 OUT

2.7.     Курсоры

SQL Server создан для обработки наборов данных. Однако бывают ситуации, когда необходимо обрабатывать данные построчно. Результат инструкции SELECT возвращается в серверный объект, называемый курсором, который позволяет обращаться к каждой строке результирующего набора поочередно и даже перемещаться вперед и назад по строкам набора.

SQL Server разработан и оптимизирован для операций над наборами данных или множествами. Курсор заставляет механизм управления базой данных выполнять построчную обработку. Курсор никогда не будет столь же эффективен, как эквивалентная обработка на основе множеств.

У курсоров есть пять компонентов. 

1.  Инструкция DECLARE применяется для задания инструкции SELECT, которая служит основой для формирования строк курсора. 

2.  Инструкция OPEN вызывает выполнение инструкции SELECT И загрузку строк в структуру памяти. 

3.  Инструкция FETCH применяется для извлечения одной строки из курсора. 

4.  Инструкция CLOSE завершает обработку курсора. 

5.  Инструкция DEALLOCATE удаляет курсор и освобождает структуры памяти, содержащие результирующий набор курсора.

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

Далее приведена общая синтаксическая запись объявления курсора.

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]       [ FORWARD_ONLY | SCROLL ]       [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]       [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]       [ TYPE_WARNING ] 

     FOR select_statement 

     [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;]

В следующих трех инструкциях показаны три разных способа объявления одного и того же курсора.

DECLARE curproducts CURSOR FAST_FORWARD FOR

SELECT ProductID, ProductName, ListPrice FROM Products.Product

GO

DECLARE curproducts CURSOR READ-ONLY FOR

SELECT ProductID, ProductName, ListPrice FROM Products.Product 

GO

DECLARE curproducts CURSOR FOR

SELECT ProductID, ProductName, ListPrice FROM Products.Product 

FOR READ ONLY  GO 

После объявления курсора вводится команда OPEN для выполнения инструкции SELECT.

OPEN curproducts

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

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