PL/Python 中的函式透過標準的 CREATE FUNCTION 語法宣告。
CREATE FUNCTIONfuncname
(argument-list
) RETURNSreturn-type
AS $$ # PL/Python function body $$ LANGUAGE plpython3u;
函式的正文就是一個 Python 指令碼。當函式被呼叫時,它的引數會作為列表 args
的元素傳遞;命名引數也會作為普通變數傳遞給 Python 指令碼。使用命名引數通常更具可讀性。返回值以通常的方式從 Python 程式碼返回,使用 return
或 yield
(對於結果集語句)。如果您不提供返回值,Python 會返回預設的 None
。PL/Python 將 Python 的 None
翻譯成 SQL 的 null 值。在過程中,Python 程式碼的返回值必須是 None
(通常透過在過程結束時不使用 return
語句或使用不帶引數的 return
語句來實現);否則,將引發錯誤。
例如,一個返回兩個整數中較大值的函式可以定義為
CREATE FUNCTION pymax (a integer, b integer) RETURNS integer AS $$ if a > b: return a return b $$ LANGUAGE plpython3u;
作為函式定義正文提供的 Python 程式碼會被轉換成一個 Python 函式。例如,上面的程式碼會產生
def __plpython_procedure_pymax_23456(): if a > b: return a return b
假設 23456 是 PostgreSQL 分配給該函式的 OID。
引數被設定為全域性變數。由於 Python 的作用域規則,這會產生一個微妙的後果:在函式內部,一個引數變數不能被重新賦值為包含該變數名本身的表示式的值,除非該變數在塊中被重新宣告為全域性變數。例如,以下程式碼將無法工作:
CREATE FUNCTION pystrip(x text) RETURNS text AS $$ x = x.strip() # error return x $$ LANGUAGE plpython3u;
因為對 x
的賦值使 x
成為整個塊的區域性變數,所以賦值右側的 x
指的是一個尚未賦值的區域性變數 x
,而不是 PL/Python 函式引數。使用 global
語句,可以使其工作:
CREATE FUNCTION pystrip(x text) RETURNS text AS $$ global x x = x.strip() # ok now return x $$ LANGUAGE plpython3u;
但最好不要依賴 PL/Python 的此實現細節。最好將函式引數視為只讀。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。