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

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

Пример 2.4.

Эта инструкция вернет в приложение результирующий набор

USE Sale

GO 

CREATE PROCEDURE Proc3 

AS 

SELECT key_client, fam, city, name_firm FROM Client

2.3.     Конструкции, управляющие ходом выполнения

В хранимых процедурах может применяться несколько конструкций, управляющих ходом выполнения процедуры:

♦ RETURN; ♦ IF...ELSE; ♦ BEGIN... END;

♦ CASE;

♦ WHILE; ♦ BREAK/CONTINUE;

♦ WAITFOR; ♦ GOTO.

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

Инструкция RETURN завершает выполнение процедуры и возвращает управление вызывающему приложению.  

Пример 2.5.

После выполнения инструкции RETURN никакие инструкции не выполняются

CREATE PROCEDURE Proc4  

AS 

--Эта инструкция вернет 1

RETURN 1

--Любой код, начиная с этого места, выполняться не будет

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

Пример 2.6.

Пример демонстрирует влияние значения null на результат сравнения. Вне зависимости от того, будет истинным условие @а>@b или @а<@b, всегда будет выполняться ветка ELSE SELECT @b.

DECLARE@a INT     ,@b INT  SET @a = 0 SET @b = null  IF @a>@b SELECT @a ELSE SELECT @b

Инструкция BEGIN...END позволяет обозначить блоки программного кода, которые следует выполнить.

Пример 2.7.

Проверяется условие существования в таблице firm строки со столбцом name_firm, равным значению переменной (или параметра) @f. Если такая строка отсутствует, то выполняется команда INSERT, в противном случае выдается сообщение "Фирма в базе уже зарегистрирована".

      USE Sale

GO 

DECLARE@f NVARCHAR(50) 

SET @f = 'Franchi S.p.A.' 

IF exists(SELECT* from dbo.firm where name_firm=@f)  BEGIN 

                                         SELECT'Фирма в базе уже зарегистрирована' 

END 

ELSE 

BEGIN 

                                       INSERT INTO dbo. firm (name_firm) VALUES (@f)

SELECT'Название фирмы добавлено в базу'  END

Конструкция CASE имеет два возможных формата использования.

Пример 2.8.

Отобразить упорядоченный список товаров с расшифровкой категорий

                              USE Sale

GO 

SELECTname_product

                                   , CASE category

                                        WHEN '1' THEN 'мебель'

                                        WHEN '2' THEN 'техника'

                                        ELSE 'офисная канцелярия'

                                   END

                                   ,price

FROMproduct 

ORDER BY name_product

Пример 2.9.

Пример запроса с использованием конструкции CASE в другом формате.

                      CREATE PROCEDURE ProcMax@a int=13

                                                , @b int=12

                                                , @c int=16

AS 

SELECT CASE

                                  WHEN @a>=@b and @a>=@c THEN str(@a)+ ' максимум' 

                                  WHEN @b>=@a and @b>=@c THEN str(@b)+ ' максимум' 

                                  WHEN @c>=@b and @c>=@a THEN str(@c)+ ' максимум'