选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.1 已于 2016 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

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 脚本。调用函数时,参数值以变量 $1 ... $n 的形式传入 Tcl 脚本。Tcl 代码按通常方式使用 return 语句返回结果。

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

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目前对域类型还没有完整支持:它把域 当作底层标量类型同样对待。这意味着与该域关联的约束不会被强制执行。 对于函数参数来说这不是问题,但如果把PL/Tcl 函数声明为返回域类型,就会带来隐患。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。