DROP PROCEDURE

DROP PROCEDURE — удалить процедуру


Синтаксис

DROP PROCEDURE [ IF EXISTS ] имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]

Описание

Команда DROP PROCEDURE удаляет определение одной или нескольких существующих процедур. Для выполнения этой команды пользователь должен быть владельцем соответствующих(ей) процедур(ы). Обычно следует указывать типы аргументов процедуры, так как может существовать несколько различных процедур с одинаковыми именами и разными списками аргументов.


Параметры

IF EXISTS

Не считать ошибкой, если эта процедура не существует. В этом случае выдается только замечание.

имя

Имя существующей процедуры (может быть дополнено схемой).

режим_аргумента

Режим аргумента: IN (входной), OUT (выходной), INOUT (входной и выходной) или VARIADIC (переменный). Если этот параметр опущен, значение по умолчанию равно IN (но см. ниже).

имя_аргумента

Имя аргумента. Обратите внимание, что команда DROP PROCEDURE фактически не обращает внимания на имена аргументов, поскольку для идентификации процедуры используются только типы данных ее аргументов.

тип_аргумента

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

CASCADE

Автоматически удалять объекты, зависящие от этой процедуры, и, в свою очередь, все объекты, зависящие от этих объектов (см. раздел Отслеживание зависимостей).

RESTRICT

Отказать в удалении этой процедуры, если от нее зависят какие-либо объекты. Это поведение по умолчанию.


Примечания

Если существует только одна процедура с данным именем, то список аргументов можно опустить. В этом случает нужно опустить и скобки.

В QHB достаточно перечислить входные аргументы (включая INOUT), поскольку одноименным подпрограммам запрещено иметь одинаковые списки входных аргументов. Более того, эта команда DROP на самом деле не будет проверять, корректно ли вы написали типы аргументов OUT, поэтому все аргументы, явно помеченные как OUT, ни на что не влияют. Однако их все равно рекомендуется писать для согласованности с соответствующей командой CREATE.

Для совместимости со стандартом SQL также разрешается писать все типы данных аргументов (включая типы аргументов OUT) без маркеров режим_аргумента. При таком подходе типы аргументов OUT этой процедуры будут сверяться с указанными в ее команде CREATE. Эта возможность создает неоднозначность, поскольку когда список аргументов не содержит маркеры режим_аргумента, неясно, какое правило подразумевается. Команда DROP попытается выполнить поиск обоими способами и выдаст ошибку, если будут найдены две разные процедуры. Во избежание риска возникновения подобной неоднозначности рекомендуется не позволять маркерам IN подразумеваться по умолчанию, а писать их явно, тем самым вынуждая команду использовать традиционную интерпретацию QHB.

Рассмотренные правила поиска также действуют и для других команд, работающих с существующими процедурами, например ALTER PROCEDURE и COMMENT ON PROCEDURE.


Примеры

Если существует только одна процедура do_db_maintenance, этой команды достаточно, чтобы удалить ее:

DROP PROCEDURE do_db_maintenance;

При таком определении процедуры:

CREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...

ее сможет удалить любая из этих команд:

DROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text);
DROP PROCEDURE do_db_maintenance(IN text, OUT text);
DROP PROCEDURE do_db_maintenance(IN text);
DROP PROCEDURE do_db_maintenance(text);
DROP PROCEDURE do_db_maintenance(text, text);  -- потенциально неоднозначная

Однако последний пример может быть неоднозначным, если существует, скажем, процедура

CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...

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

Эта команда соответствует стандарту SQL со следующими расширениями QHB:

  • Стандарт позволяет удалять одной командой только одну процедуру.

  • Параметр IF EXISTS является расширением.

  • Возможность задавать режимы и имена аргументов является расширением, а правила поиска меняются, когда задаются режимы.


См. также

CREATE PROCEDURE, ALTER PROCEDURE, DROP FUNCTION, DROP ROUTINE