Перейти к основному содержимому

CREATE PROCEDURE

примечание

Эта страница переведена при помощи нейросети GigaChat.

CREATE PROCEDURE — создание новой процедуры.

Синтаксис

CREATE [ OR REPLACE ] PROCEDURE
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
| sql_body
} ...

Описание

CREATE PROCEDURE определяет новую процедуру. CREATE OR REPLACE PROCEDURE либо создаст новую процедуру, либо заменит существующее определение. Чтобы иметь возможность определить процедуру, пользователь должен обладать привилегией USAGE на языке.

Если указано имя схемы, то процедура создается в указанной схеме. В противном случае она создается в текущей схеме. Имя новой процедуры не должно совпадать ни с одной существующей процедурой или функцией с теми же типами входных аргументов в той же схеме. Однако процедуры и функции разных типов аргументов могут иметь одно и то же имя (это называется перегрузкой).

Чтобы заменить текущее определение существующей процедуры, используйте CREATE OR REPLACE PROCEDURE. Невозможно изменить имя или типы аргументов процедуры таким образом (если попробовать это сделать, фактически создать новую, отличную процедуру).

Когда CREATE OR REPLACE PROCEDURE используется для замены существующей процедуры, владение процедурой и разрешения не изменяются. Всем остальным свойствам процедуры присваиваются значения, указанные или подразумеваемые в команде. Необходимо быть владельцем процедуры, чтобы заменить ее (это включает в себя членство в владеющей роли).

Пользователь, который создает процедуру, становится владельцем этой процедуры.

Чтобы иметь возможность создать процедуру, необходимо иметь привилегию USAGE на типы аргументов.

См. раздел 38.4 для получения дополнительной информации о написании процедур.

Параметры

name
Указывает имя процедуры, при необходимости дополненное схемой, которая должна быть создана.
argmode
Указывает режим аргумента процедуры: IN, OUT, INOUT или VARIADIC. По умолчанию используется IN.
argname
Задает имя аргумента процедуры.
argtype
Указывает тип(ы) аргументов процедуры, при необходимости дополненный схемой. Аргумент может быть базовым, составным или доменным типом, а также ссылкой на тип столбца таблицы.

В зависимости от языка реализации допустимо использовать псевдотипы, такие как cstring. Псевдотипы указывают на то, что фактический тип аргумента либо не полностью определен, либо выходит за рамки обычных SQL-типов.

Для ссылки на тип столбца используется синтаксис table_name.column_name%TYPE. Это может помочь сделать процедуру устойчивой к изменениям в структуре таблицы.

default_expr
Задает выражение, которое будет использоваться в качестве значения по умолчанию, если параметр не указан. Это выражение должно быть приведено к типу аргумента параметра. Все входные параметры, идущие после параметра со значением по умолчанию, также должны иметь значения по умолчанию.
lang_name
Указывает имя языка, на котором реализована процедура. Это может быть sql, c, internal или имя пользовательского процедурного языка, например, plpgsql. По умолчанию используется sql, если указан sql_body. Заключение имени языка в одинарные кавычки устарело и требует соблюдения регистра.
TRANSFORM {FOR TYPE type_name} [, ... ]
Устанавливает список преобразований, которые необходимо применять при вызове процедуры. Такие преобразования используются между типами SQL и типами данных, специфичными для языков (смотрите CREATE TRANSFORM). Реализации процедурных языков обычно имеют жестко запрограммированные знания о встроенных типах, поэтому указывать преобразования не требуется. Если язык не знает, как обработать тип и преобразование не указано, будет применено поведение по умолчанию, которое зависит от конкретной реализации.
[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
Указывает контекст привилегий, в котором выполняется процедура. SECURITY INVOKER означает выполнение с правами вызывающего пользователя (по умолчанию). SECURITY DEFINER — выполнение с правами владельца процедуры.

Ключевое слово EXTERNAL допустимо для совместимости с SQL, но в PostgreSQL является необязательным и действует на все процедуры, а не только внешние.

Если используется SECURITY DEFINER, процедура не может выполнять команды управления транзакциями (например, COMMIT, ROLLBACK — в зависимости от языка).

configuration_parameter
value
Выражение SET позволяет установить значение конфигурационного параметра при входе в процедуру. После выхода из нее параметр возвращается к предыдущему значению. SET FROM CURRENT сохраняет текущее значение параметра в момент выполнения CREATE PROCEDURE и применяет его при вызове процедуры.

Если SET задан в определении процедуры, то SET LOCAL внутри нее действует только в пределах процедуры, и прежнее значение параметра все равно будет восстановлено при выходе из процедуры. Однако обычная команда SET (без LOCAL) отменяет эффект SET из определения. Эффекты такой команды будут сохраняться после выхода из процедуры, если только текущая транзакция не будет отменена.

Процедуры с SET не могут выполнять команды управления транзакциями.

Смотрите SET и «Настройка сервера» для получения дополнительной информации об именах параметров и допустимых значениях.

definition
Указывает строковую константу, содержащую тело процедуры. Ее интерпретация зависит от используемого языка. Это может быть имя внутренней процедуры, путь к объектному файлу, SQL-команда или текст на процедурном языке.

Рекомендуется заключать определение процедуры в доллары, а не одинарные кавычки, чтобы избежать экранирования кавычек и обратных слешей внутри тела процедуры.

obj_file, link_symbol
Задает форму AS для процедур на языке C, загружаемых динамически, если имя функции в C-коде отличается от имени SQL-процедуры. obj_file — имя файла общей библиотеки, интерпретируется как и для команды LOAD, link_symbol — имя процедуры в исходном C-коде. Если link_symbol не указан, предполагается, что он такой же, как у определяемой процедуры SQL.

Файл загружается один раз за сессию. Чтобы перезагрузить его (например, при разработке), нужно начать новую сессию.

sql_body
Тело процедуры, написанной на LANGUAGE SQL. Оно должно быть оформлено как блок:
BEGIN ATOMIC
statement;
statement;
...
statement;
END

Эта форма определения аналогична использованию строковой константы (описано выше), однако между ними существуют важные отличия. Такой способ допустим только для процедур с языком LANGUAGE SQL, тогда как строковая форма поддерживается для всех языков. В данном случае тело разбирается на этапе создания процедуры, в отличие от строковой формы, которая анализируется при выполнении. Поэтому здесь невозможно использовать полиморфные типы аргументов и другие конструкции, которые не могут быть разрешены заранее.

Кроме того, при использовании этой формы автоматически отслеживаются зависимости от объектов, задействованных в теле процедуры, что обеспечивает корректную работу команды DROP ... CASCADE. В случае строковой формы такие зависимости не фиксируются, и могут остаться «висячие» определения процедур.

Наконец, данный способ ближе к стандарту SQL и обеспечивает лучшую совместимость с другими реализациями SQL.

Примечания

Смотрите CREATE FUNCTION для получения дополнительной информации о создании функций, которая также применима к процедурам.

Используйте CALL, чтобы выполнить процедуру.

Примеры

CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;

или

CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
BEGIN ATOMIC
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
END;

и пример вызова:

CALL insert_data(1, 2);

Совместимость

CREATE PROCEDURE определена в стандарте SQL. Реализация PostgreSQL может использоваться совместимым образом, но имеет множество расширений. Подробнее описано в CREATE FUNCTION.

Смотрите также

ALTER PROCEDURE, DROP PROCEDURE, CALL, CREATE FUNCTION