CREATE PROCEDURE#

CREATE PROCEDURE

CREATE PROCEDURE

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 на типы аргументов.

Ссылайтесь на Раздел 35.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, но оно необязательно, поскольку, в отличие от 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 и Глава 18 для получения дополнительной информации о допустимых именах параметров и их значениях.

definition

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

Часто полезно использовать кавычки доллара (см. Раздел 4.1.2.4) для написания строки определения процедуры, а не обычного синтаксиса с апострофами. Без использования кавычек доллара, любые апострофы или обратные косые черты в определении процедуры должны быть удвоены для экранирования.

obj_file, link_symbol

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

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

sql_body

Тело процедуры LANGUAGE SQL. Это должно быть блоком

BEGIN ATOMIC
  statement;
  statement;
  ...
  statement;
END

Это похоже на написание текста тела процедуры в виде строковой константы (см. definition выше), но есть некоторые отличия: эта форма работает только для 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. Реализация Tantor BE может использоваться совместимым образом, но имеет множество расширений. Дополнительные сведения см. также CREATE FUNCTION.