可以定義多個具有相同 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 函式名稱反映了眾多可能約定中的一種。
如果您在文件中發現任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。