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>' 
  } ...

Описание

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

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

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

При использовании CREATE OR REPLACE PROCEDURE для замены существующей процедуры владелец и права доступа к процедуре остаются без изменений. Все остальные свойства процедуры устанавливаются в соответствии со значениями, указанными или подразумеваемыми в команде. Вы должны быть владельцем процедуры, чтобы её заменить (включая членство в роли-владельце).

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

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

Дополнительную информацию о создании процедур см. в разделе «Определяемые пользователем процедуры» документации PostgreSQL.

Параметры

  • name

    • Имя создаваемой процедуры (может быть квалифицировано именем схемы).
  • argmode

    • Режим аргумента: IN, INOUT или VARIADIC. Если не указан, по умолчанию используется IN. (Аргументы OUT в настоящее время для процедур не поддерживаются. Используйте INOUT.)
  • argname

    • Имя аргумента.
  • argtype

    • Тип(ы) данных аргументов процедуры (при необходимости с указанием схемы), если таковые имеются. Типы аргументов могут быть базовыми, составными или доменными, либо ссылаться на тип столбца таблицы.

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

    • Тип столбца указывается как table_name.column_name%TYPE. Использование этой возможности иногда помогает сделать процедуру независимой от изменений в определении таблицы.

  • default_expr

    • Выражение, которое будет использоваться как значение по умолчанию, если параметр не указан. Выражение должно быть приводимо к типу аргумента. Каждый входной параметр в списке аргументов, следующий за параметром со значением по умолчанию, также должен иметь значение по умолчанию.
  • lang_name

    • Имя языка, на котором реализована процедура. Может быть SQL, C, internal или имя пользовательского процедурного языка, например plpgsql. Заключение имени в одинарные кавычки устарело и требует точного совпадения регистра.
  • TRANSFORM { FOR TYPE type_name } [, ... ] }

    • Перечисляет преобразования, которые должны применяться при вызове процедуры. Преобразования обеспечивают конвертацию между SQL-типами и типами данных, специфичными для языка. Реализации процедурных языков обычно имеют встроенное знание о базовых типах, поэтому их здесь указывать не нужно. Если реализация процедурного языка не знает, как обрабатывать тип, и при этом не предоставлено преобразование, она вернётся к поведению по умолчанию при конвертации типов данных, но это зависит от реализации.
  • [EXTERNAL] SECURITY INVOKER

  • [EXTERNAL] SECURITY DEFINER

    • SECURITY INVOKER (по умолчанию) означает, что процедура выполняется с привилегиями пользователя, который её вызвал.
    • SECURITY DEFINER указывает, что процедура выполняется с привилегиями пользователя, который её создал.
    • Ключевое слово EXTERNAL допускается для соответствия стандарту SQL, но является необязательным, поскольку, в отличие от SQL, эта возможность применяется ко всем процедурам, а не только к внешним.
    • Процедура SECURITY DEFINER не может выполнять операторы управления транзакциями (например, COMMIT и ROLLBACK — в зависимости от языка).
  • configuration_parameter

  • value

    • Предложение SET устанавливает значение параметра конфигурации сессии при входе в процедуру. При выходе из процедуры параметр восстанавливается до предыдущего значения. SET FROM CURRENT сохраняет значение параметра, действующее в момент выполнения команды CREATE PROCEDURE, как значение, которое будет применяться при входе в процедуру.
    • Если к процедуре прикреплено предложение SET, то эффекты команды SET LOCAL, выполненной внутри процедуры для той же переменной, ограничиваются рамками процедуры: прежнее значение параметра всё равно будет восстановлено при выходе. Однако обычная команда SET (без LOCAL) переопределяет предложение SET, аналогично тому, как это происходит после SET LOCAL: эффект такой команды сохраняется после завершения процедуры, если только текущая транзакция не будет откатываться.
    • Если к процедуре прикреплено предложение SET, то такая процедура не может выполнять операторы управления транзакциями (например, COMMIT и ROLLBACK — в зависимости от языка).
    • Дополнительную информацию о допустимых именах и значениях параметров см. в команде SET.
  • definition

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

    • Часто удобно использовать долларное кавычкование (см. «Строковые константы с долларным кавычкованием» в документации PostgreSQL) для записи строки определения процедуры вместо обычного синтаксиса с одинарными кавычками. Без долларного кавычкования все одинарные кавычки и обратные слэши в определении процедуры должны быть экранированы путём их удвоения.

  • obj_file, link_symbol

    • Эта форма предложения AS используется для динамически загружаемых процедур на языке C, когда имя процедуры в исходном коде на C отличается от имени SQL-процедуры. Строка obj_file — это имя файла, содержащего динамически загружаемый объект, и интерпретируется так же, как в команде LOAD. Строка link_symbol — это имя процедуры в исходном коде на C. Если символ ссылки опущен, предполагается, что он совпадает с именем создаваемой SQL-процедуры.
    • Когда несколько вызовов CREATE PROCEDURE ссылаются на один и тот же объектный файл, файл загружается только один раз за сессию. Чтобы выгрузить и снова загрузить файл (возможно, в процессе разработки), начните новую сессию.

Примечания

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

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

Примеры

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

CALL insert_data(1, 2);

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

Команда CREATE PROCEDURE определена в стандарте SQL. Версия Database похожа, но не полностью совместима. Подробности см. также в разделе CREATE FUNCTION.

См. также

ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION, CALL