FirebirdSQL logo

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>]'
Table 1. Параметры оператора CREATE PACKAGE BODY
Параметр Описание

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 деклараций (DECLARE внешняя функция) в настоящее время не поддерживается внутри пакетов.

Кто может создать тело пакета?

Выполнить оператор CREATE PACKAGE BODY могут:

docnext count = 6

Примеры

Example 1. Создание тела пакета
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, CREATE PACKAGE.

DROP PACKAGE BODY

Назначение

Удаление тела пакета.

Доступно в

DSQL

Синтаксис
DROP PACKAGE BODY package_name
Table 1. Параметры оператора DROP PACKAGE BODY
Параметр Описание

package_name

Имя пакета.

Оператор DROP PACKAGE BODY удаляет тело пакета.

Кто может удалить тело пакета?

Выполнить оператор DROP PACKAGE BODY могут:

Примеры

Example 1. Удаление тела пакета
DROP PACKAGE BODY APP_VAR;
См. также:

CREATE PACKAGE BODY, DROP PACKAGE.

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 создаёт новое или пересоздаёт существующее тело пакета.Если тело пакета с таким именем уже существует, то оператор попытается удалить его и создать новое тело пакета.После пересоздания тела пакета привилегии на выполнение подпрограмм пакета и привилегии самого пакета сохраняются.

Примеры

Example 1. Пересоздание тела пакета
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