CREATE PROCEDURE#
CREATE PROCEDURE
CREATE PROCEDURE — определить новую процедуру
Синтаксис
CREATE [ OR REPLACE ] PROCEDUREname
( [ [argmode
] [argname
]argtype
[ { DEFAULT | = }default_expr
] [, ...] ] ) { LANGUAGElang_name
| TRANSFORM { FOR TYPEtype_name
} [, ... ] | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | SETconfiguration_parameter
{ TOvalue
| =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
%TYPEdefault_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.