在postgreSQL中用currval计算年龄

Posted

技术标签:

【中文标题】在postgreSQL中用currval计算年龄【英文标题】:Calculating age with currval in postgreSQL 【发布时间】:2016-12-06 19:41:44 【问题描述】:

我创建了一个包含人员表的数据库,其中包含人员的所有信息,例如他们的名字、姓氏、性别、出生日期和电子邮件。此表中的每一行都有一个连续的 peopleID。我正在尝试创建一个存储过程和触发器来自动计算刚刚输入的人的年龄。我正在尝试使用 currval 来获取最后插入的 peopleID。

这是我的存储过程:

CREATE OR REPLACE FUNCTION PersonAge (peopleID INT)
RETURNS INTERVAL AS
$$
DECLARE
birthday date := (SELECT People.dateOfBirth
        FROM People
        );
BEGIN
RETURN age(birthday);
END;
$$
LANGUAGE plpgsql

这是我的触发器:

CREATE TRIGGER CalculateAge
AFTER INSERT OR UPDATE ON People
FOR EACH ROW
EXECUTE PROCEDURE PersonAge( SELECT currval(‘people_id_seq’));

这是我尝试使用插入语句实现它时遇到的错误:

ERROR:  syntax error at or near "currval"
LINE 5: EXECUTE PROCEDURE PersonAge( SELECT currval('people_id_seq')...
                                        ^
********** Error **********

ERROR: syntax error at or near "currval"
SQL state: 42601
Character: 116

【问题讨论】:

带参数的触发函数?.. 我想我对这里需要哪些特定元素感到有些困惑。我对触发器相当陌生。 确定。我挑选了文档供您阅读 - 请查看我的答案 不用担心。我们在这里为您提供帮助 【参考方案1】:

您以不受支持的方式传递参数,请 read docs

请注意,函数声明时必须不带参数,即使它 期望接收在 CREATE TRIGGER 中指定的一些参数——比如 参数通过 TG_ARGV 传递,如下所述。

TG_ARGV[]

文本的数据类型数组;来自 CREATE TRIGGER 的参数 陈述。索引从 0 开始计数。无效索引(小于 0 或 大于或等于 tg_nargs) 会导致 null 值。

(强调我的)

【讨论】:

当您发出CREATE TRIGGER CalculateAge 时,这将在TG_ARGV 中提供currval(‘people_id_seq’) 的值,而不是在INSERTUPDATE 上执行时。我不知道作者想做什么。

以上是关于在postgreSQL中用currval计算年龄的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 php 文件中使用 PostgreSql 的 CURRVAL / RETURNING?

在excel中计算平均年龄

用身份证号码怎么计算年龄?

Oracle 根据传入日期参数 返回年龄 函数......

Oracle中NEXTVAL 和 CURRVAL的使用

如何在 postgresql 中用它的根替换一个单词?