Обработка результатов запросов. Подпрограммы в Transact-SQL (Лабораторная работа № 4), страница 2

2.1.3. Изменение и удаление хранимых процедур

Чтобы обновить код процедуры, целесообразно использовать команду alterprocedure, которая синтаксически мало отличается от createprocedure:

alter proc[edure] имя_процедуры

           [{@параметр тип_параметра [varying] [= значение] [output]}

           [,…n]]

           as тело_процедуры

Смысл всех секций и ключевых слов, используемых в этой команде, пояснялся ранее. Разумеется, в alterprocedure задается имя существующей процедуры – оно остается неизменным. Только список параметров и тело процедуры могут быть изменены.

Команда удаления процедур – dropprocedure. В качестве параметра принимает имя или список имен удаляемых процедур.

2.1.4. Пользовательские функции

Функция отличается от процедуры тем, что она всегда возвращает некоторое значение и может присутствовать в выражениях как операнд. В лабораторной работе №3 были частично рассмотрены некоторые встроенные функции SQL Server. Но разработчики БД имеют возможность создавать собственные функции средствами Transact-SQL.

Выделяют следующие типы пользовательских функций.

1.  Скалярные функции. Возвращают скалярное значение любого из типов данных, за исключением timestamp, text, ntext, image, table и cursor.

2.  Встроенные функции (Inline-функции). Возвращают значение типа table. Их тело включает только оператор select. Особенностью встроенных функций является то, что их код вставляется непосредственно в команды, из которых они вызываются.

3.  Табличные функции типа Multi-statement(Multi-statement Table-valued). Возвращают значение типа данных table. Однако, в отличие от встроенных функций, они могут содержать в своем теле несколько SQL-операторов, вызовы процедур, обработку курсоров и т. д.

Создание пользовательских функций в Transact-SQL выполняется при помощи оператора createfunction. Transact-SQL поддерживает три варианта записи этого оператора, по одному для каждого типа функций.

Синтаксис оператора создания скалярной функции выглядит следующим образом:

create function имя_функции (

           [{@параметр скалярный_тип_данных [= значение]} [,…n]] )

           returns скалярный_тип_данных

           [as]

           begin

                       тело_функции

                       return выражение

           end

Параметры в скалярных функциях имеют только скалярный тип. А тип возвращаемого значения указывается после ключевого слова returns.

Тело функции заключается в операторные скобки beginend. Хотя бы один раз в нем должна встретиться команда return с указанием после нее результата, который нужно вернуть вовне – это есть значение функции. Результат должен иметь тип, указанный после ключевого слова returns в заголовке.

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

Оператор создания встроенных функций имеет следующий синтаксис:

create function имя_функции (

           [{@параметр скалярный_тип_данных [= значение]} [,…n]] )

           returnstable

           [as]

                       return запрос

Нетрудно заметить, что отличие этого оператора заключается в явном задании типа возвращаемого значения – table. После ключевого слова as не допускается указание конструкции beginend, а разрешается только использование единственного запроса select. Набор строк, выдаваемый по этому запросу, становится результирующим возвращаемым значением.

Функции Multi-statement создаются с помощью варианта команды createfunction, имеющего следующий синтаксис:

create function имя_функции (

           [{@параметр скалярный_тип_данных [= значение]} [,…n]] )

           returns @локальная_переменная table <определения_столбцов>

           [as]

           begin

                       тело_функции