2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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

引數的模式: 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 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 擴充套件

  • SQL 標準只允許一次刪除一個儲存過程。

  • IF EXISTS 選項是擴充套件功能。

  • 指定引數模式和名稱的功能是擴充套件功能,並且在給出模式時查詢規則會有所不同。

提交更正

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