Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5361 / 282 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00

Лекция 21: Создание хранимых процедур и управление этими процедурами

Использование RETURN

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

Сначала рассмотрим пример использования RETURN просто для выхода из хранимой процедуры. Мы создадим модифицированную версию процедуры GetUnitPrice, которая проверяет, было ли задано входное значение, и если нет, то выводит сообщение для пользователя и возвращается в вызывающую программу. Для этого мы определим входной параметр со значением по умолчанию NULL и затем будем проверять это значение в процедуре; если входной параметр имеет значение NULL, это означает, что входное значение не задано. Ниже приводится пример удаления и повторного создания этой процедуры:

USE Northwind
GO

IF EXISTS   (SELECT     name
                 FROM       sysobjects
                 WHERE      name = "GetUnitPrice" AND
                              type = "P")
DROP PROCEDURE GetUnitPrice
GO

CREATE PROCEDURE GetUnitPrice @prod_id int = NULL
AS
IF @prod_id IS NULL
     BEGIN
          PRINT "Please enter a product ID number"
          RETURN
     END
ELSE
     BEGIN
          SELECT   UnitPrice
          FROM     Products
          WHERE    ProductID = @prod_id
     END
GO

А теперь запустим GetUnitPrice без ввода входного значения и посмотрим результаты. Для запуска этой хранимой процедуры вы должны указать оператор EXECUTE, поскольку вызов процедуры не является первым оператором этого пакета. Используйте следующую последовательность:

PRINT "Before procedure"
EXECUTE GetUnitPrice
PRINT "After procedure returns from stored procedure"
GO

Результаты будут выведены в следующей форме:

Before procedure (До процедуры)
Please enter a product ID number (Введите идентификационный номер продукта)
After procedure returns from stored procedure (После возврата из хранимой процедуры)

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

Теперь рассмотрим использование RETURN для возврата значения в вызывающую программу. Возвращаемое значение должно быть целым. Это может быть константа или переменная. Вы должны объявить в вызывающей программе переменную, в которой будет храниться возвращаемое значение для дальнейшего использования в этой программе. Например, следующая процедура возвратит значение 1, если цена единицы продукции для продукта, указанного во входном параметре, меньше $100 ; иначе она возвратит значение 99.

CREATE PROCEDURE CheckUnitPrice @prod_id int
AS
IF   (SELECT UnitPrice
      FROM   Products
      WHERE  ProductID = @prod_id) < 100
      RETURN 1
ELSE
      RETURN 99
GO

Для вызова этой хранимой процедуры и использования возвращаемого значения объявите в вызывающей программе переменную и приравняйте ее возвращаемому значению хранимой процедуры (указав значение 66 в ProductID для входного параметра):

DECLARE @return_val int
EXECUTE @return_val = CheckUnitPrice 66
IF (@return_val = 1) PRINT "Unit price is less than $100"
GO

В результате будет выведен текст "Unit price is less than $100" (Цена единицы продукции меньше $100), поскольку цена единицы продукции для указанного продукта равна $17 и, тем самым, возвращаемое значение равно 1. Убедитесь в том, что вы задали целый тип данных, когда объявляете переменную, которая используется для хранения значения, возвращаемого оператором RETURN, поскольку этот оператор возвращает целое значение.

Андрей Панков
Андрей Панков
Россия, г. Челябинск, Южно-Уральский государственный университет, 2012