CREATE PACKAGE BODY
Создание тела пакета.
DSQL
CREATE PACKAGE BODY package_name AS BEGIN [<package_item> ...] [<package_body_item> ...] END <package_item> ::= <function_decl>; | <procedure_decl>; <function_decl> ::= FUNCTION func_name [(<in_params>)] RETURNS <type> [NOT NULL] [COLLATE collation] [DETERMINISTIC] <procedure_decl> ::= PROCEDURE proc_name [(<in_params>)] [RETURNS (<out_params>)] <package_body_item> ::= <function_impl> | <procedure_impl> <function_impl> ::= FUNCTION func_name [(<in_impl_params>)] RETURNS <type> [NOT NULL] [COLLATE collation] [DETERMINISTIC] <routine-body> <procedure_impl> ::= PROCEDURE proc_name [(<in_impl_params>)] [RETURNS (<out_params>)] <routine-body> <in_params> ::= <inparam> [, <inparam> ...] <inparam> ::= <param_decl> [{= | DEFAULT} <value>] <in_impl_params> ::= <param_decl> [, <param_decl> ...] <value> ::= {literal | NULL | context_var} <out_params> ::= <outparam> [, <outparam> ...] <outparam> ::= <param_decl> <param_decl> ::= paramname <type> [NOT NULL] [COLLATE collation] <type> ::= <datatype> | [TYPE OF] domain_name | TYPE OF COLUMN rel.col <datatype> ::= <scalar_datatype> | <blob_datatype> <scalar_datatype> ::= См. Синтаксис скалярных типов данных <blob_datatype> ::= См. Синтаксис типа данных BLOB <routine-body> ::= <psql-routine-body> | <external-routine-spec> <psql-routine-body> ::= См. Синтаксис тела модуля <external-routine-spec> ::= <external-routine-reference> [AS <extbody>] <external-routine-reference> ::= EXTERNAL NAME <extname> ENGINE <engine> <extname> ::= '<module-name>!<routine-name>[!<misc-info>]'
Параметр | Описание |
---|---|
package_name |
Имя пакета.Может содержать до 63 символов. |
function_decl |
Объявление функции. |
procedure_decl |
Объявление процедуры. |
function_impl |
Реализация функции. |
procedure_impl |
Реализация процедуры. |
proc_name |
Имя процедуры.Может содержать до 63 символов. |
func_name |
Имя функции.Может содержать до 63 символов. |
inparam |
Описание входного параметра. |
outparam |
Описание выходного параметра. |
subfunc_impl |
Реализация подпрограммы–функции. |
subproc_impl |
Реализация подпрограммы–процедуры. |
module-name |
Имя внешнего модуля, в котором расположена процедура/функция. |
routine-name |
Внутреннее имя процедуры/функции внутри внешнего модуля. |
misc-info |
Определяемая пользователем информация для передачи в функцию внешнего модуля. |
extbody |
Тело внешней процедуры или функции. Строковый литерал которыйможет использоваться UDR для различных целей. |
engine |
Имя движка для использования внешних функций.Обычно указывается имя UDR. |
literal |
Литерал, совместимый по типу с параметром. |
context_var |
Любая контекстная переменная, тип которой совместим с типом параметра. |
paramname |
Имя входного или выходного параметра процедуры/функции.Может содержать до 63 символов.Имя параметра должно быть уникальным среди входных и выходных параметров процедуры/функции, а также её локальных переменных. |
datatype |
Тип данных SQL. |
collation |
Порядок сортировки. |
domain_name |
Имя домена. |
rel |
Имя таблицы или представления. |
col |
Имя столбца таблицы или представления. |
Оператор CREATE PACKAGE BODY
создаёт новое тело пакета.Тело пакета может быть создано только после того как будет создан заголовок пакета.Если заголовка пакета с именем package_name не существует, то будет выдана соответствующая ошибка.
Все процедуры и функции, объявленные в заголовке пакета, должны быть реализованы в теле пакета.Кроме того, должны быть реализованы и все процедуры и функции, объявленные в теле пакета.Процедуры и функции, определенные в теле пакета, но не объявленные в заголовке пакета, не видны вне тела пакета.
Имена процедур и функций, объявленные в теле пакета, должны быть уникальны среди имён процедур и функций, объявленных в заголовке и теле пакета.
Note
|
Желательно чтобы имена хранимых процедур и функций пакета не пересекались с именами хранимых процедур и функций из глобального пространства имен, хотя это и допустимо.Дело в том, что в настоящее время вы не сможете вызвать функцию/процедуру из глобального пространства имён внутри пакета, если в пакете объявлена одноименная функция/процедура.В этом случае всегда будет вызвана процедура/функция пакета. |
В теле пакеты должны быть реализованы все подпрограммы, стой же сигнатурой, что и объявленные в заголовке и в начале тела пакета.
Значения по умолчанию для параметров процедур, которые указываются в <package_item>
, не могут быть переопределены. Это означает, что они могут быть в <package_body_item>
только для частных процедур, которые не были объявлены.
Note
|
UDF деклараций ( |
Выполнить оператор CREATE PACKAGE BODY
могут:
Владелец пакета;
Пользователи с привилегией ALTER ANY PACKAGE
.
CREATE PACKAGE BODY APP_VAR
AS
BEGIN
-- Возвращает дату начала периода
FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC
AS
BEGIN
RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEBEGIN');
END
-- Возвращает дату окончания периода
FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC
AS
BEGIN
RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEEND');
END
-- Устанавливает диапазон дат рабочего периода
PROCEDURE SET_DATERANGE(ADATEBEGIN DATE, ADATEEND DATE)
AS
BEGIN
RDB$SET_CONTEXT('USER_SESSION', 'DATEBEGIN', ADATEBEGIN);
RDB$SET_CONTEXT('USER_SESSION', 'DATEEND', ADATEEND);
END
END
DROP PACKAGE BODY
Удаление тела пакета.
DSQL
DROP PACKAGE BODY package_name
Параметр | Описание |
---|---|
package_name |
Имя пакета. |
Оператор DROP PACKAGE BODY
удаляет тело пакета.
Выполнить оператор DROP PACKAGE BODY
могут:
Владелец пакета;
Пользователи с привилегией ALTER ANY PACKAGE
.
DROP PACKAGE BODY APP_VAR;
RECREATE PACKAGE BODY
Создание нового и пересоздание существующего тела пакета.
DSQL
RECREATE PACKAGE BODY package_name AS BEGIN [<package_item> ...] [<package_body_item> ...] END <package_item> ::= <function_decl>; | <procedure_decl>; <function_decl> ::= FUNCTION func_name [(<in_params>)] RETURNS <type> [COLLATE collation] [<function_options>] <procedure_decl> ::= PROCEDURE proc_name [(<in_params>)] [RETURNS (<out_params>)] [<procedure_options>] <package_body_item> ::= <function_impl> | <procedure_impl> <function_impl> ::= FUNCTION func_name [(<in_impl_params>)] RETURNS <type> [COLLATE collation] [DETERMINISTIC] <routine-body> <procedure_impl> ::= PROCEDURE proc_name [(<in_impl_params>)] [RETURNS (<out_params>)] <routine-body> Подробнее см. CREATE PACKAGE BODY.
Оператор RECREATE PACKAGE BODY
создаёт новое или пересоздаёт существующее тело пакета.Если тело пакета с таким именем уже существует, то оператор попытается удалить его и создать новое тело пакета.После пересоздания тела пакета привилегии на выполнение подпрограмм пакета и привилегии самого пакета сохраняются.
RECREATE PACKAGE BODY APP_VAR
AS
BEGIN
-- Возвращает дату начала периода
FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC
AS
BEGIN
RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEBEGIN');
END
-- Возвращает дату окончания периода
FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC
AS
BEGIN
RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEEND');
END
-- Устанавливает диапазон дат рабочего периода
PROCEDURE SET_DATERANGE(ADATEBEGIN DATE, ADATEEND DATE)
AS
BEGIN
RDB$SET_CONTEXT('USER_SESSION', 'DATEBEGIN', ADATEBEGIN);
RDB$SET_CONTEXT('USER_SESSION', 'DATEEND', ADATEEND);
END
END