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