pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
假设你有下面这张表:
CREATE TABLE EMPLOYEE (
name text,
basesalary integer,
bonus integer
);
为了得到总薪酬(基本工资 + 奖金),我们可以 像下面这样定义一个函数:
CREATE FUNCTION totalcomp(integer, integer) RETURNS integer
AS 'return $_[0] + $_[1]'
LANGUAGE 'plperl';
注意,函数的参数如预期那样通过 @_ 传递。
现在我们可以像这样使用我们的函数:
SELECT name, totalcomp(basesalary, bonus) FROM employee;
不过,我们也可以把整个元组传给我们的函数:
CREATE FUNCTION empcomp(employee) RETURNS integer AS '
my $emp = shift;
return $emp->{''basesalary''} + $emp->{''bonus''};
' LANGUAGE 'plperl';
元组以哈希的引用形式传递。键是 元组中字段的名字。哈希的值是 元组中对应字段的值。
由于函数体是作为 SQL 字符串字面量 传给 CREATE FUNCTION 的,你必须转义 Perl 源码中的单引号,可以像 上面那样将它们加倍,也可以 使用扩展引号函数( q[]、qq[]、 qw[])。反斜线必须 通过加倍来转义。
新函数 empcomp 可以这样使用:
SELECT name, empcomp(employee) FROM employee;
下面是一个由于安全原因不允许文件系统 操作而不能工作的函数例子:
CREATE FUNCTION badfunc() RETURNS integer AS '
open(TEMP, ">/tmp/badfile");
print TEMP "Gotcha!\n";
return 1;
' LANGUAGE 'plperl';
这个函数的创建会成功,但执行它不会成功。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。