Кто может создать функцию?
Выполнить оператор CREATE FUNCTION
могут:
-
Пользователи с привилегией
CREATE FUNCTION
.
Пользователь, создавший хранимую функцию, становится её владельцем.
Выполнить оператор CREATE FUNCTION
могут:
Пользователи с привилегией CREATE FUNCTION
.
Пользователь, создавший хранимую функцию, становится её владельцем.
CREATE FUNCTION ADD_INT(A INT, B INT DEFAULT 0)
RETURNS INT
AS
BEGIN
RETURN A+B;
END
Вызов в запросе:
SELECT ADD_INT(2, 3) AS R FROM RDB$DATABASE
Вызов внутри PSQL кода, второй необязательный параметр не указан:
MY_VAR = ADD_INT(A);
CREATE FUNCTION FN_E()
RETURNS DOUBLE PRECISION DETERMINISTIC
AS
BEGIN
RETURN EXP(1);
END
Функция, возвращающая имя мнемоники по имени столбца и значения мнемоники.
CREATE FUNCTION GET_MNEMONIC (
AFIELD_NAME TYPE OF COLUMN RDB$TYPES.RDB$FIELD_NAME,
ATYPE TYPE OF COLUMN RDB$TYPES.RDB$TYPE)
RETURNS TYPE OF COLUMN RDB$TYPES.RDB$TYPE_NAME
AS
BEGIN
RETURN (SELECT RDB$TYPE_NAME
FROM RDB$TYPES
WHERE RDB$FIELD_NAME = :AFIELD_NAME
AND RDB$TYPE = :ATYPE);
END
То же самое, но хранимая функция будет выполняться с привилегиями определяющего пользователя (владельца функции).
CREATE FUNCTION GET_MNEMONIC (
AFIELD_NAME TYPE OF COLUMN RDB$TYPES.RDB$FIELD_NAME,
ATYPE TYPE OF COLUMN RDB$TYPES.RDB$TYPE)
RETURNS TYPE OF COLUMN RDB$TYPES.RDB$TYPE_NAME
SQL SECURITY DEFINER
AS
BEGIN
RETURN (SELECT RDB$TYPE_NAME
FROM RDB$TYPES
WHERE RDB$FIELD_NAME = :AFIELD_NAME
AND RDB$TYPE = :ATYPE);
END
Создание функции находящейся во внешнем модуле (UDR). Реализация функции расположена во внешнем модуле udrcpp_example.Имя функции внутри модуля — wait_event.
CREATE FUNCTION wait_event (
event_name varchar(63) CHARACTER SET ascii
) RETURNS INTEGER
EXTERNAL NAME 'udrcpp_example!wait_event'
ENGINE udr
Создание функции для перевода числа в шестнадцатеричный формат.
CREATE FUNCTION INT_TO_HEX (
ANumber BIGINT,
AByte_Per_Number SMALLINT = 8)
RETURNS CHAR(66)
AS
DECLARE VARIABLE xMod SMALLINT;
DECLARE VARIABLE xResult VARCHAR(64);
DECLARE FUNCTION TO_HEX(ANum SMALLINT) RETURNS CHAR
AS
BEGIN
RETURN CASE ANum
WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
WHEN 15 THEN 'F'
ELSE NULL
END;
END
BEGIN
xMod = MOD(ANumber, 16);
ANumber = ANumber / 16;
xResult = TO_HEX(xMod);
WHILE (ANUMBER > 0) DO
BEGIN
xMod = MOD(ANumber, 16);
ANumber = ANumber / 16;
xResult = TO_HEX(xMod) || xResult;
END
RETURN '0x' || LPAD(xResult, AByte_Per_Number * 2, '0');
END
Входные параметры заключаются в скобки после имени хранимой функции.Они передаются в функцию по значению, то есть любые изменения входных параметров внутри функции никак не повлияет на значения этих параметров в вызывающей программе.
У каждого параметра указывается тип данных.Кроме того, для параметра можно указать ограничение NOT NULL
, тем самым запретив передавать в него значение NULL
.
Для параметра строкового типа существует возможность задать порядок сортировки с помощью предложения COLLATE
.
Входные параметры могут иметь значение по умолчанию.Параметры, для которых заданы значения, должны располагаться в конце списка параметров.
В качестве типа параметра можно указать имя домена.В этом случае параметр будет наследовать все характеристики домена.
Если перед названием домена дополнительно используется предложение TYPE OF
, то используется только тип данных домена — не проверяется (не используется) его ограничение (если оно есть в домене) на NOT NULL
, CHECK
ограничения и/или значения по умолчанию.Если домен текстового типа, то всегда используется его набор символов и порядок сортировки.