PL/Python関数

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 42章PL/Python - Python手続き言語 | 早送り | 次のページ

# 42.2. PL/Python関数

PL/Pythonで作成された関数は標準的なCREATE FUNCTION構文で宣言されます。

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

関数本体は単なるPythonスクリプトです。 関数が呼び出されると、引数は`args[]`リストの要素として渡されます。 名前付きの引数も通常の変数としてPythonスクリプトに渡されます。 通常、名前付き引数の方が可読性が高くなります。 結果は、Pythonコードから通常の方法、`return`または`yield`（結果セット文の場合）で返されるものです。 戻り値を提供しない場合、Pythonはデフォルトの`None`を返します。 PL/PythonはPythonの`None`をSQLのNULL値に変換します。

たとえば、2つの整数の内大きな数を返す関数は以下のように定義することができます。

    CREATE FUNCTION pymax (a integer, b integer)
      RETURNS integer
    AS $$
      if a > b:
        return a
      return b
    $$ LANGUAGE plpythonu;

関数定義の本体として提供された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 plpythonu;

`x`への代入は、`x`をブロック全体に対するローカル変数にしようとし、そして、代入の右辺の`x`がPL/Pythonの関数パラメータではなく、まだ割り当てられていないローカル変数`x`を参照するためです。 `global`文を使用することで、動作するようになります。

    CREATE FUNCTION pystrip(x text)
      RETURNS text
    AS $$
      global x
      x = x.strip()  # ok now
      return x
    $$ LANGUAGE plpythonu;

しかし、PL/Pythonのこうした詳細な実装に依存しないようにすることを勧めます。 関数パラメータは読み取りのみとして扱うことを勧めます。

前のページ | ホーム | 次のページ
Python 2対Python 3 | 上に戻る | データ値