防止UDF命名衝突 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

防止UDF命名衝突

在實作之前,您可以考慮您的UDF命名慣例,以避免潛在的衝突和非預期的結果。因為函數名稱可以過載,所以它們可能與現有和未來的 Amazon Redshift 函數名稱發生衝突。本主題討論過載,並說明避免衝突的策略。

多載函數名稱

函數是以其名稱和簽章來識別,而簽章是輸入引數的數目和引數的資料類型。如果相同結構描述中的兩個函數具有不同的簽章,則它們可以具有相同的名稱。換言之,函數名稱可以過載

當您執行查詢時,查詢引擎會根據您提供的引數數目和引數的資料類型來決定要呼叫哪個函數。您可以使用過載來模擬具有可變引數數目的函數,而此數目最多可為 CREATE FUNCTION 命令允許的限制。

避免與內建 Amazon Redshift 函數衝突

建議您UDFs使用字首 命名所有 f_。Amazon Redshift 會保留專屬於 UDFs的字f_首,並以 為UDF名稱加上字首f_,可確保UDF您的姓名不會與任何現有或未來的 Amazon Redshift 內建SQL函數名稱衝突。例如,透過命名新的 UDF f_sum,您可以避免與 Amazon Redshift SUM函數衝突。同樣地,如果您命名新的函數 f_fibonacci,則如果 Amazon Redshift 新增名為 的函數於未來的版本FIBONACCI中,則避免衝突。

如果 和內建SQL函數存在於不同的結構描述中,您可以建立UDF與現有 Amazon Redshift 內建函數具有相同名稱UDF和簽章的 ,而不會使函數名稱過載。由於系統目錄結構描述 pg_catalog 中存在內建函數,因此您可以在另一個結構描述中建立UDF具有相同名稱的 ,例如公有或使用者定義的結構描述。在某些情況下,您可能會呼叫未使用結構描述名稱明確限定的函數。如果是這樣,Amazon Redshift 預設會先搜尋 pg_catalog 結構描述。因此,內建函數會在UDF具有相同名稱的新 之前執行。

您可以透過將搜尋路徑設定為將 pg_catalog 放在末尾來變更此行為。如果您這樣做,您的 UDFs 優先於內建函數,但此做法可能會導致非預期的結果。採用唯一命名策略 (例如使用保留字首 f_) 是更為可靠的實務。如需詳細資訊,請參閱 SETsearch_path