FirebirdSQL logo

Тело модуля

Тело модуля может быть написано на языке PSQL или быть телом внешнего модуля.

Синтаксис тела модуля
<routine-body> ::=
    <psql-routine-spec>
  | <external-routine-spec>

<psql-routine-spec> ::=
  [<rights-clause>] <psql-routine-body>


<rights-clause> ::=
  SQL SECURITY {DEFINER | INVOKER}


<psql-routine-body> ::=
  AS
    [<declarations>]
  BEGIN
    [<PSQL_statements>]
  END

<declarations> ::=
  <declare-item> [<declare-item> ...]

<declare-item> ::=
    <declare-var>;
  | <declare-cursor>;
  | <subroutine-declaration>;
  | <subroutine-implementation>

<subroutine-declaration> ::= <subfunc-decl> | <subproc-decl>

<subroutine-implementation> ::= <subfunc-impl> | <subproc-impl>

<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. Параметры тела модуля
Параметр Описание

declare-var

Объявление локальной переменной.

declare-cursor

Объявление именованного курсора.

subfunc-decl

Объявление подпрограммы – функции.

subproc-decl

Объявление подпрограммы – процедуры.

subfunc-impl

Реализация подпрограммы – функции.

subproc-impl

Реализация подпрограммы – процедуры.

extbody

Тело внешней процедуры.Строковый литерал который может использоваться UDR для различных целей.

module-name

Имя внешнего модуля, в котором расположена функция.

routine-name

Внутреннее имя функции внутри внешнего модуля.

misc-info

Определяемая пользователем информация для передачи в функцию внешнего модуля.

engine

Имя движка для использования внешних функций.Обычно указывается имя UDR.

Тело PSQL модуля

Тело PSQL начинается с необязательного раздела, в котором объявляются переменные, курсоры и подпрограммы.Далее следует блок операторов, которые выполняются в логической последовательности как программа.Блок операторов — или составной оператор — заключен в ключевые слова BEGIN и END и выполняется как единый блок кода.Основной блок BEGIN …​ END может содержать любое количество других блоков BEGIN …​ END, как встроенных, так и последовательных.Максимальная вложенность блоков составляет 512 уровней.Все операторы, кроме BEGIN и END, заканчиваются точкой с запятой (“;”).Никакой другой символ не может использоваться в качестве терминатора для операторов PSQL.

Изменение терминатора в isql

Здесь мы немного отвлечёмся для того, чтобы объяснить как переключить терминатор в утилите isql.Это необходимо, чтобы иметь возможность определять в ней PSQL модули, не конфликтуя с самим isql, который использует тот же самый символ, точку с запятой (;), как разделитель операторов.