Разработка приложений баз данных для СУБД Sybase SQL Anywhere

       

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


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

Функции создаются оператором CREATE FUNCTION. Их модификация производится при помощи оператора ALTER FUNCTION. Для разработки функций пользователи должны иметь класс полномочий RESOURCE (). В качестве примера представим хранимую процедуру Get_number_absent () в виде хранимой функции 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. Эти отличия состоят в следующем:

  • В функциях допустимы только входные формальные параметры (типа IN). В связи с этим при описании формальных параметров не используются служебные слова IN, OUT и INOUT.
  • После описания формальных параметров функции должен следовать оператор RETURNS. Данный оператор указывает тип возвращаемого функцией значения.
  • В теле функции обязательно должен присутствовать оператор RETURN, который специфицирует возвращаемое функцией значение.
  • Функция не может формировать результирующее множество.



  • Хранимые функции могут вызываться любым пользователем, имеющего для соответствующей функции привилегию 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 ().

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


    Содержание раздела