2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 的 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 的此實現細節。最好將函式引數視為只讀。

提交更正

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