支援的版本:目前 (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

44.1. PL/Python 函式 #

PL/Python 中的函式透過標準的 CREATE FUNCTION 語法宣告

CREATE FUNCTION funcname (argument-list)
  RETURNS return-type
AS $$
  # PL/Python function body
$$ LANGUAGE plpython3u;

函式的主體只是一個 Python 指令碼。當函式被呼叫時,其引數會以列表 args 的元素傳遞;具名引數也會以普通變數傳遞給 Python 指令碼。使用具名引數通常更易於閱讀。結果以通常的方式從 Python 程式碼傳回,使用 returnyield(如果是結果集陳述式)。如果您不提供傳回值,Python 會傳回預設的 NonePL/Python 會將 Python 的 None 轉換為 SQL 空值。在程序中,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 的此實作細節。最好將函式參數視為唯讀。

提交更正

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