CREATE PROCEDURE — создание новой процедуры
CREATE [ OR REPLACE ] PROCEDURE
name ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ { DEFAULT | = } default_expr ] [, ...] ] )
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| SET configuration_parameter { TO значение | = значение | FROM CURRENT }
| AS 'определение'
| AS 'obj_file', 'link_symbol'
| sql_body
} ...
CREATE PROCEDURE определяет новую процедуру.
CREATE OR REPLACE PROCEDURE либо создаёт новую процедуру, либо заменяет существующее определение. Чтобы иметь возможность определить процедуру, пользователь должен иметь
USAGE право на использование языка.
Если имя схемы указано, то процедура создаётся в заданной схеме. В противном случае она создаётся в текущей схеме. Имя новой процедуры не должно совпадать с именами существующих процедур или функций с теми же типами входных аргументов в той же схеме. Однако процедуры и функции с разными типами аргументов могут иметь одинаковые имена (это называется перегрузка).
Чтобы заменить текущее определение существующей процедуры, используйте
CREATE OR REPLACE PROCEDURE. Таким способом невозможно изменить имя или типы аргументов процедуры (при попытке сделать это фактически будет создана новая, отдельная процедура).
Когда CREATE OR REPLACE PROCEDURE используется для замены существующей процедуры, владелец и права доступа к процедуре не изменяются. Всем остальным свойствам процедуры присваиваются значения, указанные или подразумеваемые в команде. Вы должны быть владельцем процедуры
для её замены (включая членство в роли-владельце).
Пользователь, создающий процедуру, становится её владельцем.
Чтобы иметь возможность создать процедуру, необходимо иметь USAGE
право на использование типов аргументов.
Обратитесь к Раздел 5.1.4 для получения дополнительной информации о написании процедур.
nameИмя создаваемой процедуры (опционально с указанием схемы).
режим_аргумента
Режим аргумента: IN, OUT,
INOUT, или VARIADIC. Если параметр опущен,
по умолчанию используется IN.
имя_аргументаИмя аргумента.
тип_аргументаТип(ы) данных аргументов процедуры (необязательно с указанием схемы), если таковые имеются. Типы аргументов могут быть базовыми, составными или доменными типами, либо могут ссылаться на тип столбца таблицы.
В зависимости от языка реализации также может быть разрешено
указывать «псевдотипы» такие как cstring.
Псевдотипы указывают на то, что фактический тип аргумента либо
определен не полностью, либо находится вне набора обычных типов данных SQL.
Ссылка на тип столбца указывается с помощью записи
.
Использование этого функционала иногда может помочь сделать процедуру независимой от
изменений в определении таблицы.
table_name.column_name%TYPE
default_exprВыражение, используемое в качестве значения по умолчанию, если параметр не указан. Выражение должно быть приводимым к типу данных аргумента. Все входные параметры, следующие за параметром со значением по умолчанию, также должны иметь значения по умолчанию.
lang_name
Имя языка, на котором реализована процедура.
Это может быть sql, c,
internal, или имя пользовательского
процедурного языка, например, plpgsql. Значением по умолчанию является
sql if sql_body , если оно указано. Заключение
имени в одинарные кавычки является устаревшим и требует точного соответствия регистра.
TRANSFORM { FOR TYPE type_name } [, ... ] }Список преобразований, которые должны применяться при вызове процедуры. Преобразования обеспечивают преобразование между типами SQL и типами данных, специфичными для языка; см. CREATE TRANSFORM. Процедурный язык реализации обычно обладают встроенными сведениями о встроенных типах данных, поэтому их не требуется перечислять здесь. Если реализация процедурного языка не поддерживает тип данных и преобразование не определено, будет использовано поведение по умолчанию для преобразования типов данных, однако это зависит от конкретной реализации.
[EXTERNAL] SECURITY INVOKER[EXTERNAL] SECURITY DEFINERSECURITY INVOKER указывает на то, что процедура должна выполняться с привилегиями вызвавшего её пользователя. Это поведение используется по умолчанию. SECURITY DEFINER
указывает на то, что процедура должна выполняться с привилегиями владеющего ей пользователя.
Ключевое слово EXTERNAL допускается для обеспечения соответствия стандарту SQL, но является необязательным, так как, в отличие от SQL, данная функциональность применяется ко всем процедурам, а не только к внешним.
A SECURITY DEFINER процедура не может выполнять
операторы управления транзакциями (например, COMMIT
и ROLLBACK, в зависимости от языка).
configuration_parametervalue
Предложение SET устанавливает для указанного параметра конфигурации
заданное значение при входе в процедуру,
которое при выходе из нее заменяется его прежним значением.
SET FROM CURRENT сохраняет значение параметра,
действующее на момент выполнения команды, CREATE PROCEDURE в качестве значения,
которое будет применяться при входе в процедуру.
Если SET предложение добавлено к процедуре, то
действие команды SET LOCAL команда, выполняемая внутри
процедуры для той же переменной ограничены этой процедурой:
прежнее значение параметра конфигурации все равно восстанавливается при выходе из процедуры.
Однако обычная
SET команда (без LOCAL) переопределяет
SET предложение, подобно тому, как это произошло бы для предыдущей SET
LOCAL команды: результаты выполнения такой команды сохранятся после
выхода из процедуры, если только текущая транзакция не будет откачена.
Если SET предложение добавлено к процедуре, то
эта процедура не может выполнять операторы управления транзакциями (
например, COMMIT и ROLLBACK,
в зависимости от языка).
См. SET и Глава 3.4 для получения дополнительных сведений о допустимых именах и значениях параметров.
определениеСтроковая константа, определяющая процедуру; смысл которой зависит от языка. Это может быть имя внутренней процедуры, путь к объектному файлу, SQL-команда или текст на процедурном языке.
Часто удобно использовать долларовое цитирование (см. Раздел 2.1.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оператор;оператор; ...оператор; 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. Digital Q.DataBase реализация может использоваться в режиме совместимости, но имеет множество расширений. Для получения подробных сведений см. также
CREATE FUNCTION.