6.4. Хранимые функции

Хранимые функции являются разновидностью хранимых процедур. Они включены в состав программных объектов баз данных с целью наибольшего соответствия языкам программирования, например Си или Паскаль. Как и в этих языках программирования, каждая хранимая функция рассматривается в качестве выражения, формирующего одно единственное значение. Хранимые функции применяются для расширения функциональных возможностей операторов SELECT и ряда других SQL-операторов.

Функции создаются оператором CREATE FUNCTION. Их модификация производится при помощи оператора ALTER FUNCTION. Для разработки функций пользователи должны иметь класс полномочий RESOURCE (см. п. 5.2). В качестве примера представим хранимую процедуру Get_number_absent (см. п. 6.2) в виде хранимой функции Fun_get_num_abs:

//Создание новой функции
CREATE FUNCTION Fun_get_num_abs
/* Функция определяет количество книг, находящихся
на руках у читателя, имеющего читательскую 
карточку с номером Par_N_reader. Это количество 
возвращается в качестве результата функции. */
(
    Par_N_reader SMALLINT 
)
        RETURNS SMALLINT
BEGIN 
DECLARE Count_books SMALLINT;
    SELECT COUNT(*) INTO Count_books
        FROM Stepanov.Absent
        WHERE N_reader = Par_N_reader;
                RETURN (count_books);
END

Для проверки работы этой функции следует выполнить следующие SQL-операторы:

//Проверка процедуры Fun_get_num_abs
             /* Если переменная уже есть, то
             создавать ее заново нельзя */
//CREATE VARIABLE Rez SMALLINT;
         /* Вызов функции и присваивание
         ее результатов переменной Rez */
SET Rez = Fun_get_num_abs(80);
SELECT Rez

В результате обращения к функции Fun_get_num_abs в переменную Rez запишется значение четыре, точно такое же как после выполнения процедуры Get_number_absent.

Оператор CREATE FUNCTION несколько отличается от оператора CREATE PROCEDURE. Эти отличия состоят в следующем:

Хранимые функции могут вызываться любым пользователем, имеющего для соответствующей функции привилегию EXECUTE. Для предоставления права вызова функций, также как и для процедур, используется оператор GRANT EXECUTE. Чтобы предоставить библиотекарям возможность применения функции fun_get_num_abs необходимо выполнить следующий оператор:

//Установка привилегии EXECUTE библиотекарям
GRANT EXECUTE ON 
Fun_get_num_abs TO LIBRARIANS

Опять же, как для процедур, лишение привилегий на использование функций осуществляется оператором REVOKE EXECUTE:

//Лишение библиотекарей привилегии EXECUTE 
REVOKE EXECUTE ON 
Fun_get_num_abs TO LIBRARIANS

Ранее созданные функции хранятся в базах данных до тех, пока они не удаляются посредством оператора DROP FUNCTION. Для удаления из базы данных функции Fun_get_num_abs необходимо выполнить этот оператор следующим образом:

//Удаление функции 
DROP FUNCTION Fun_get_num_abs.

Удаление функции может производить только ее владелец или пользователь с полномочиями класса DBA (см. табл. 7).

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

Назад | Содержание | Вперед