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