PL/Tcl言語で関数を作成するには、以下の標準構文を使用して下さい。
CREATE FUNCTION funcname (argument-types) RETURNS return-type AS ' # PL/Tcl function body ' 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;
今のところ、複合型の戻り値を返す機能はサポートされていません。