本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立純量 Python UDF
純量 Python UDF 包含呼叫函數時執行的 Python 程式,並傳回單一值。CREATE FUNCTION 命令定義下列參數:
-
(選用) 輸入引數。每個引數必須具有一個名稱和一個資料類型。
-
一個傳回資料類型。
-
一個可執行的 Python 程式。
這時的輸入及傳回的資料類型可為 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE 或 TIMESTAMP。此外,Python UDF 還可以使用資料類型 ANYELEMENT,而 Amazon Redshift 會根據執行期提供的引數,自動將其轉換為標準資料類型。如需更多資訊,請參閱 ANYELEMENT 資料類型
當 Amazon Redshift 查詢呼叫純量 UDF 時,下列步驟會在執行期發生。
-
函數會將輸入引數轉換為 Python 資料類型。
如需將 Amazon Redshift 資料類型映射至 Python 資料類型,請參閱 Python UDF 資料類型。
-
函數會執行 Python 程式,剖析已轉換的輸入引數。
-
Python 程式碼會傳回單一值。傳回值的資料類型必須對應至函數定義所指定的 RETURNS 資料類型。
-
函數會將 Python 傳回值轉換為指定的 Amazon Redshift 資料類型,然後將該值傳回至佇列。
注意
Python 3 不可用於 Python UDF。要獲得對 Amazon Redshift UDF 的 Python 3 支持,請改用建立純量 Lambda UDF。
純量 Python UDF 範例
下列範例會建立一個函數,比較兩個數字並傳回較大的值。請注意,雙貨幣符號 ($$) 之間程式碼的縮排是 Python 需求。如需詳細資訊,請參閱 CREATE FUNCTION。
create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;
下列查詢會呼叫新的 f_greater
函數來查詢 SALES 資料表,並傳回 COMMISSION 或 20% 的 PRICEPAID,以較大者為準。
select f_py_greater (commission, pricepaid*0.20) from sales;
ANYELEMENT 資料類型
ANYELEMENT 是多型資料類型。這表示,若對引數的資料類型使用 ANYELEMENT 來宣告函數,則函數可以接受任何標準 Amazon Redshift 資料類型,做為呼叫函數時該引數的輸入。ANYELEMENT 引數會設為呼叫函數時實際傳遞至其中的資料類型。
如果函數使用多個 ANYELEMENT 資料類型,則在呼叫函數時,它們必須全都解析為相同的實際資料類型。所有 ANYELEMENT 引數資料類型都會設為傳遞至 ANYELEMENT 之第一個引數的實際資料類型。例如,宣告為 f_equal(anyelement, anyelement)
的函數將採用任何兩個輸入值,只要它們是相同的資料類型。
如果函數的輸入值宣告為 ANYELEMENT,則至少一個輸入引數必須是 ANYELEMENT。傳回值的實際資料類型將與提供給 ANYELEMENT 輸入引數的實際資料類型相同。