支援版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不再支援版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

36.6. 函數多載 #

只要函數所接受的參數不同,就可以用相同的 SQL 名稱定義多個函數。 換句話說,函數名稱可以多載。 無論您是否使用它,此功能都需要在某些使用者不信任其他使用者的資料庫中呼叫函數時採取安全預防措施;請參閱第 10.3 節。 執行查詢時,伺服器將根據提供的參數的資料類型和數量來決定要呼叫哪個函數。 多載也可以用來模擬具有可變數量參數的函數,最多可達到有限的最大數量。

建立多載函數系列時,應小心不要造成模糊不清。 例如,給定函數

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

對於像 test(1, 1.5) 這樣的一些簡單輸入,立即清楚應該呼叫哪個函數。 目前實作的解析規則在第 10 章中描述,但設計一個微妙地依賴此行為的系統是不明智的。

接收複合類型之單一參數的函數通常不應與該類型的任何屬性(欄位)同名。 請記住,attribute(table) 被視為等同於 table.attribute。 如果複合類型上的函數與複合類型的屬性之間存在不明確之處,則始終會使用該屬性。 可以透過對函數名稱進行結構描述限定(也就是說,schema.func(table) )來覆蓋該選擇,但最好透過不選擇衝突的名稱來避免該問題。

另一個可能的衝突是可變參數和非可變參數函數之間。 例如,可以同時建立 foo(numeric)foo(VARIADIC numeric[])。 在這種情況下,不清楚應該將哪一個與提供單個數值參數的呼叫(例如 foo(10.1))進行匹配。 規則是使用搜尋路徑中較早出現的函數,或者如果兩個函數位於同一個結構描述中,則優先選擇非可變參數的函數。

在多載 C 語言函數時,還有一個額外的限制:多載函數系列中每個函數的 C 名稱必須與所有其他函數(無論是內部的還是動態載入的)的 C 名稱不同。 如果違反此規則,則行為不可移植。 您可能會收到執行階段連結器錯誤,或者其中一個函數將被呼叫(通常是內部的函數)。 SQL CREATE FUNCTION 命令的 AS 子句的替代形式將 SQL 函數名稱與 C 原始碼中的函數名稱分離。 例如

CREATE FUNCTION test(int) RETURNS int
    AS 'filename', 'test_1arg'
    LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
    AS 'filename', 'test_2arg'
    LANGUAGE C;

此處 C 函數的名稱反映了許多可能的慣例之一。

提交更正

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