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.