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 標準相容,也允許編寫所有引數資料類型(包括 OUT
引數的資料類型),而無需任何 argmode
標記。完成此操作後,將根據指令驗證程序的 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 擴充功能
標準僅允許每個指令刪除一個程序。
IF EXISTS
選項是一個擴充功能。
指定引數模式和名稱的能力是一個擴充功能,並且在給定模式時,查找規則會有所不同。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單回報文件問題。