×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

6.1.74. CREATE PROCEDURE

6.1.74. CREATE PROCEDURE

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 DEFINER

SECURITY INVOKER указывает на то, что процедура должна выполняться с привилегиями вызвавшего её пользователя. Это поведение используется по умолчанию. SECURITY DEFINER указывает на то, что процедура должна выполняться с привилегиями владеющего ей пользователя.

Ключевое слово EXTERNAL допускается для обеспечения соответствия стандарту SQL, но является необязательным, так как, в отличие от SQL, данная функциональность применяется ко всем процедурам, а не только к внешним.

A 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 и Глава 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.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению