gpt4 book ai didi

Postgresql函数返回触发器

转载 作者:行者123 更新时间:2023-11-29 13:46:26 25 4
gpt4 key购买 nike

我的触发器有问题。我创建了一个触发器和一个函数用于在执行 INSERT 更新同一表中的字段时。正在返回:

Error: function "loss_func" in FROM has return type trigger that is not supported LINE 1: SELECT * FROM table.loss_func ()

函数

CREATE OR REPLACE FUNCTION loss_func()
RETURNS trigger AS $loss_func$
BEGIN
NEW.dt_creation := to_char(now(), 'YYYY-MM-DD');

RETURN NULL;
END;
$loss_func$ LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION loss_func()
OWNER TO postgres;

触发器

CREATE TRIGGER tgr_loss
AFTER INSERT ON loss
FOR EACH ROW
EXECUTE PROCEDURE loss_func();

我做错了什么?

最佳答案

代码的工作版本。- 触发器现在触发 BEFORE 插入和更新 dt_creation 的值并返回记录的 NEW 版本:

drop table loss;

create table loss (
id int ,
dt_created varchar);

CREATE OR REPLACE FUNCTION loss_func()
RETURNS trigger AS $loss_func$
BEGIN
NEW.dt_created := to_char(now(), 'YYYY-MM-DD');
RETURN NEW;
END;
$loss_func$ LANGUAGE plpgsql VOLATILE
COST 100;

ALTER FUNCTION loss_func()
OWNER TO postgres;

CREATE TRIGGER tgr_loss
BEFORE INSERT ON loss
FOR EACH ROW
EXECUTE PROCEDURE loss_func();

insert into loss(id) values(1);

我建议避免使用触发器的另一个解决方案是在创建表时为 dt_creation 使用默认值(并使用时间戳而不是将日期存储为 varchar):

...
dt_creation timestamp default now(),
...

或者您可以更改表格以将默认值设置为 now() :

alter table loss 
alter column dt_creation set default now();

关于Postgresql函数返回触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47639890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com