DROP PROCEDURE — 刪除一個儲存過程
DROP PROCEDURE [ IF EXISTS ]name
[ ( [ [argmode
] [argname
]argtype
[, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]
DROP PROCEDURE
刪除一個或多個現有儲存過程的定義。要執行此命令,使用者必須是儲存過程的所有者。通常必須指定儲存過程的引數型別,因為具有相同名稱但引數列表不同的多個儲存過程可能存在。
IF EXISTS
如果儲存過程不存在,則不引發錯誤。在這種情況下會發出一個通知。
name
現有儲存過程的名稱(可選模式限定)。
argmode
引數的模式: IN
, OUT
, INOUT
, 或 VARIADIC
。如果省略,則預設為 IN
(但見下文)。
argname
引數的名稱。請注意,DROP PROCEDURE
實際上並不關注引數名稱,因為只有引數資料型別用於確定儲存過程的身份。
argtype
儲存過程的引數的資料型別(可選模式限定),如果有的話。詳情見下文。
CASCADE
自動刪除依賴於該儲存過程的物件,以及反過來依賴於這些物件的所有物件(參見 第 5.15 節)。
RESTRICT
如果任何物件依賴於該儲存過程,則拒絕刪除它。這是預設行為。
如果具有給定名稱的儲存過程只有一個,則可以省略引數列表。在這種情況下也省略括號。
在 PostgreSQL 中,列出輸入(包括 INOUT
)引數就足夠了,因為不允許同名的例程共享相同的輸入引數列表。此外,DROP
命令實際上不會檢查您是否正確編寫了 OUT
引數的型別;因此,任何明確標記為 OUT
的引數都只是無關緊要的。但建議寫上它們,以與相應的 CREATE
命令保持一致。
為了相容 SQL 標準,也可以在沒有 argmode
標記的情況下編寫所有引數資料型別(包括 OUT
引數的)。執行此操作時,將 驗證 儲存過程的 OUT
引數的型別是否與命令匹配。此規定會產生歧義,因為當引數列表中沒有 argmode
標記時,不清楚意圖遵循哪個規則。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); -- potentially ambiguous
但是,如果還存在以下情況,最後一個示例將會產生歧義:
CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...
此命令符合 SQL 標準,並帶有以下 PostgreSQL 擴充套件
SQL 標準只允許一次刪除一個儲存過程。
IF EXISTS
選項是擴充套件功能。
指定引數模式和名稱的功能是擴充套件功能,並且在給出模式時查詢規則會有所不同。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。