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
選項是一個擴充功能。
指定參數模式和名稱的功能是一個擴充功能,並且在給定模式時,查找規則會有所不同。
如果您在文件中發現任何不正確、與特定功能不符或需要進一步澄清的地方,請使用此表格來報告文件問題。