支援的版本:目前 (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 選項是一個擴充功能。

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

提交更正

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