9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面
43.2. PL/Tcl 函数和参数
上一页 上一级 第 43 章 PL/Tcl - Tcl 过程语言起始页 下一页

43.2. PL/Tcl 函数和参数

要用PL/Tcl语言创建函数,可使用标准的CREATE FUNCTION语法:

CREATE FUNCTION funcname (argument-types) RETURNS return-type AS $$
 # PL/Tcl function body
$$ LANGUAGE pltcl;

PL/TclU的函数是一样的语法,只是语言被指定为pltclu

函数的主体就是一个 Tcl 脚本。当函数被调用时,参数值会被作为名为 1 ... n的变量传递给 Tcl 脚本。结果会以常见的方式通过一个return从 Tcl 脚本中返回。

例如,一个返回两个整数值中较大值的函数可以定义为:

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

注意子句STRICT,它让我们不用去操心空输入值:如果空值被传入,函数根本就不会被调用,而是自动地返回一个空结果。

在非严格函数中,如果一个参数的实际值为空,对应的$n变量将被设置为一个空串。为了检测一个特定参数是否为空,可使用函数argisnull。例如,假设我们想要带有一个空参数和一个非空参数并且返回非空参数的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;

如上所述,要从一个 PL/Tcl 函数返回空值,可执行return_null。不管函数是严格还是非严格都可以这样做。

组合类型参数会被作为 Tcl 数组传递给函数。该数组的元素名就是组合类型的属性值。如果被传入行的一个属性为空值,它不会出现在数组中。这里是一个例子:

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函数也可以返回复合类型的结果。要这样做, Tcl模块必须返回匹配期望结果类型的列名/值对的列表。 该列表省略的任意字段名返回null,如果有意料之外的字段名,则返回一个错误。 这里是一个示例:

CREATE FUNCTION square_cube(in int, out squared int, out cubed int) AS $$
 return [list squared [expr {1ドル * 1ドル}] cubed [expr {1ドル * 1ドル * 1ドル}]]
$$ LANGUAGE pltcl;

提示

结果列表可以使用array get Tcl命令从所需元组的数组表示获得。 例如:

CREATE FUNCTION raise_pay(employee, delta int) RETURNS employee AS $$
 set 1(salary) [expr {1ドル(salary) + 2ドル}]
 return [array get 1]
$$ LANGUAGE pltcl;

PL/Tcl函数可以返回集合。要这样做,Tcl代码应该为要返回的每行调用一次 return_next,在返回标量类型时传递适当的值, 或者在返回复合类型时传递列名/值列表。这是一个返回标量类型的示例:

CREATE FUNCTION sequence(int, int) RETURNS SETOF int AS $$
 for {set i 1ドル} {$i < 2ドル} {incr i} {
 return_next $i
 }
$$ LANGUAGE pltcl;

这是一个返回复合类型的示例:

CREATE FUNCTION table_of_squares(int, int) RETURNS TABLE (x int, x2 int) AS $$
 for {set i 1ドル} {$i < 2ドル} {incr i} {
 return_next [list x $i x2 [expr {$i * $i}]]
 }
$$ LANGUAGE pltcl;

上一页 上一级 下一页
43.1. 概述 起始页 43.3. PL/Tcl 中的数据值

AltStyle によって変換されたページ (->オリジナル) /