PL/Tcl関数と引数

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

# 40.2. PL/Tcl関数と引数

PL/Tcl言語で関数を作成するには、以下の標準的なCREATE FUNCTION構文を使用してください。

    CREATE FUNCTION funcname (argument-types) RETURNS return-type AS $$
        # PL/Tcl関数本体
    $$ LANGUAGE pltcl;

PL/TclUでも、言語に`pltclu`を指定しなければならない点以外は同様です。

関数本体は、単なる小さなTclスクリプトです。 関数が呼び出された時、引数の値はTclスクリプトに`$1` ... `$`n``という変数として渡されます。 結果は通常通り`return`文を使用してTclのコードから返されます。

例えば、2つの整数のうち大きな方を返す関数は以下のように定義できます。

    CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
        if {$1 > $2} {return $1}
        return $2
    $$ LANGUAGE pltcl STRICT;

`STRICT`句に注意してください。 これによりプログラマは、入力にNULL値が与えられた場合を検討する手間を省くことができます。 NULLが渡された場合、関数はまったく呼び出されず、単にNULLという結果が自動的に返されます。

厳密（strict）でない関数では、引数の実際の値がNULLである場合、対応する`$`n``変数は空文字列に設定されます。 ある引数がNULLかどうかを検出するためには、`argisnull`関数を使用してください。 例えば、引数の片方がNULL、もう片方が非NULLであって、NULLではなく、非NULLの引数の方を返す`tcl_max`を考えると、以下のようになります。

    CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
        if {[argisnull 1]} {
            if {[argisnull 2]} { return_null }
            return $2
        }
        if {[argisnull 2]} { return $1 }
        if {$1 > $2} {return $1}
        return $2
    $$ LANGUAGE pltcl;

上で示した通り、NULL値をPL/Tcl関数から返すためには、`return_null`を実行してください。 これは、関数が厳密かどうかに関係なく、実行することができます。

複合型の引数は、Tcl配列として関数に渡されます。 配列の要素名は複合型の属性名です。 渡された行の属性がNULL値の場合、その属性は配列内には現れません。 以下に例を示します。

    CREATE TABLE employee (
        name text,
        salary integer,
        age integer
    );

    CREATE FUNCTION overpaid(employee) RETURNS boolean AS $$
        if {200000.0 < $1(salary)} {
            return "t"
        }
        if {$1(age) < 30 && 100000.0 < $1(salary)} {
            return "t"
        }
        return "f"
    $$ LANGUAGE pltcl;

今のところ、複合型の戻り値を返す機能や集合を返す機能はサポートされていません。

今のところPL/Tclはドメイン型を完全にサポートしていません。 ドメインをその背後にあるスカラ型と同様に扱います。 これは、ドメインに関連する制約が強制されないことを意味しています。 これは関数の引数では問題ありませんが、PL/Tcl関数をドメイン型を返すように宣言した場合は危険です。

前のページ | ホーム | 次のページ
概要 | 上に戻る | PL/Tclにおけるデータの値