支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11

DROP PROCEDURE

DROP PROCEDURE — 移除程序

概要

DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]

描述

DROP PROCEDURE 移除一個或多個現有程序的定義。要執行這個指令,使用者必須是程序的所有者。通常必須指定程序的引數類型,因為可能存在具有相同名稱和不同引數列表的多個不同程序。

參數

IF EXISTS

如果程序不存在,則不拋出錯誤。在這種情況下,會發出一個通知。

name

現有程序的名稱(可選擇使用綱要限定)。

argmode

引數的模式:INOUTINOUTVARIADIC。如果省略,預設值為 IN(但請參閱下文)。

argname

引數的名稱。請注意,DROP PROCEDURE 實際上並不關注引數名稱,因為僅引數資料類型用於確定程序的識別身分。

argtype

程序的引數的資料類型(可選擇使用綱要限定),如果有的話。詳情請參閱下文。

CASCADE

自動刪除依賴於該程序的物件,並依序刪除所有依賴於這些物件的物件(請參閱第 5.15 節)。

RESTRICT

如果任何物件依賴於該程序,則拒絕刪除該程序。這是預設值。

備註

如果只有一個給定名稱的程序,則可以省略引數列表。在這種情況下,也省略括號。

PostgreSQL 中,列出輸入(包括 INOUT)引數就足夠了,因為不允許相同名稱的兩個常式共享相同的輸入引數列表。此外,DROP 指令實際上不會檢查您是否正確編寫了 OUT 引數的類型;因此,任何明確標記為 OUT 的引數都只是雜訊。但是,建議編寫它們以與相應的 CREATE 指令保持一致。

為了與 SQL 標準相容,也允許編寫所有引數資料類型(包括 OUT 引數的資料類型),而無需任何 argmode 標記。完成此操作後,將根據指令驗證程序的 OUT 引數的類型。此規定產生了一個歧義,因為當引數列表不包含 argmode 標記時,不清楚預期使用哪個規則。DROP 指令將嘗試以兩種方式查找,如果找到兩個不同的程序,將拋出一個錯誤。為避免此類歧義的風險,建議明確編寫 IN 標記,而不是讓它們預設,從而強制使用傳統的 PostgreSQL 解釋。

剛才解釋的查找規則也適用於其他作用於現有程序的指令,例如 ALTER PROCEDURECOMMENT 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 選項是一個擴充功能。

  • 指定引數模式和名稱的能力是一個擴充功能,並且在給定模式時,查找規則會有所不同。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單回報文件問題。