pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
要用PL/Tcl语言创建函数,可使用标准的CREATE FUNCTION语法:
CREATE FUNCTIONfuncname(argument-types) RETURNSreturn-typeAS $$ # PL/Tcl 函数体 $$ LANGUAGE pltcl;
PL/TclU的写法相同,只是语言必须指定为pltclu。
函数体就是一段 Tcl 脚本。调用函数时,参数值以变量 $1 ... $ 的形式传入 Tcl 脚本。Tcl 代码按通常方式使用 nreturn 语句返回结果。
例如,一个返回两个整数值中较大值的函数可以定义为:
CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
if {$1 > $2} {return $1}
return $2
$$ LANGUAGE pltcl STRICT;
注意STRICT子句,它让我们不必考虑空值输入:如果传入的是空值,函数根本不会被调用,而是会自动返回空值结果。
在非严格函数中,如果某个参数的实际值为空值,对应的$变量会被设置为空串。要检测某个特定参数是否为空值,可使用函数nargisnull。例如,假设我们希望在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目前对域类型还没有完整支持:它把域 当作底层标量类型同样对待。这意味着与该域关联的约束不会被强制执行。 对于函数参数来说这不是问题,但如果把PL/Tcl 函数声明为返回域类型,就会带来隐患。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。