DROP PROCEDURE
DROP PROCEDURE — удалить процедуру
Синтаксис
DROP PROCEDURE [ IF EXISTS ]имя
[ ( [ [режим_аргумента
] [имя_аргумента
]тип_аргумента
[, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]
Описание
DROP PROCEDURE
удаляет определение одной или нескольких существующих процедур. Пользователь, выполняющий эту команду, должен быть владельцем процедур(ы). Помимо имени процедуры обычно требуется указать типы её аргументов, так как в базе данных могут существовать несколько процедур с одним именем, но с разными списками аргументов.
Параметры
IF EXISTS
Не считать ошибкой, если процедура не существует. В этом случае будет выдано замечание.
имя
Имя существующей процедуры (возможно, дополненное схемой).
режим_аргумента
Режим аргумента:
IN
илиVARIADIC
. По умолчанию подразумеваетсяIN
(но учтите следующие замечания).имя_аргумента
Имя аргумента. Заметьте, что на самом деле
DROP PROCEDURE
не обращает внимание на имена аргументов, так как для идентификации процедуры используются только их типы.тип_аргумента
Тип данных аргумента или аргументов (возможно, дополненный именем схемы), если таковые имеются. Подробности следуют ниже.
CASCADE
Автоматически удалять объекты, зависящие от данной процедуры, и, в свою очередь, все зависящие от них объекты (см. Раздел 5.14).
RESTRICT
Отказать в удалении процедуры, если от неё зависят какие-либо объекты. Это поведение по умолчанию.
Примечания
Если существует только одна процедура с заданным именем, список аргументов можно опустить. В этом случае также следует опустить скобки.
В PostgreSQL достаточно перечислить только входные аргументы (включая аргументы INOUT
), так как одноимённые подпрограммы не могут иметь одинаковые списк�� входных аргументов. Команда DROP
на самом деле не проверяет корректность типов для выходных аргументов (OUT
), поэтому аргументы, помеченные OUT
, ни на что не влияют. Тем не менее, рекомендуется указывать их для согласованности с соответствующей командой CREATE
.
Для совместимости со стандартом SQL также возможно записать все аргументы любых типов (включая аргументы OUT
) без маркеров режим_аргумента
. В этом случае типы выходных аргументов (OUT
) будут сверяться с указанными при создании. При этом возникает неоднозначность, так как в случае отсутствия маркеров режим_аргумента
в списке аргументов неясно, какое поведение ожидается. Команда DROP
попытается выполнить поиск обоими способами и выдаст ошибку, если будут найдены две разные процедуры. Для исключения такой неоднозначности рекомендуется явно указывать маркеры IN
, а не полагаться на то, что они подразумеваются по умолчанию; таким образом будет выбираться традиционное поведение PostgreSQL.
Описанные правила поиска действуют также с другими командами, работающими с существующими процедурами, например 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, но дополнена расширениями Postgres Pro:
Стандарт позволяет удалять с помощью этой команды только одну процедуру.
Указание
IF EXISTS
является расширением.Возможность указывать режимы и имена аргументов является расширением, а правила поиска при указании режимов могут меняться.