【发布时间】:2016-01-17 17:34:51
【问题描述】:
我一直试图弄清楚如何创建一个触发器/函数,该触发器/函数将在更新表行时计算一个值。这是我正在创建的 DVD 出租数据库。我有一些数据库经验,但我才开始使用触发器和函数。我想要发生的是,当员工插入电影归还日期时,它将采用租借日期并将其从归还日期中减去,然后将天差乘以每天 1.99 美元的租金成本。我有计算它的表达式。我想要一个触发器来运行表达式并将结果插入到该表中。
例如:
客户返回电影,员工在 Rent 表中输入返回日期,当更新此行时,触发器将运行一个计算欠款金额的表达式,并将结果插入到 Rent 表行中的 amount_owed 列。
这是我一直在尝试的一些事情,触发器执行了该函数,但之后我得到了一个错误。
功能代码:
CREATE OR REPLACE FUNCTION update_cus_balance(integer)
RETURNS void AS
$BODY$
BEGIN
UPDATE rent
SET amount_owed=subquery.balance
FROM (SELECT date_part('day'::text, rent.return_date - rent.rent_date) * 2.99::double precision AS balance
from rent) AS subquery
WHERE rent.rent_id=rent_id;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION update_cus_balance(integer)
OWNER TO postgres;
触发代码:
CREATE TRIGGER update_balance
AFTER UPDATE
ON rent
FOR EACH ROW
EXECUTE PROCEDURE amount_owed();
当我尝试添加 return_date 并保存更改时,PGadmin III 只会说“发生错误”。
【问题讨论】:
-
DVD 出租?多么古朴。我确实注意到您正在调用一个名为
amount_owed()的东西,但定义了一个名为update_cus_balance()的东西。 -
错误是什么?可能调用了一个不存在的函数?另外,您确定要插入一个新行,而不是实际更新现有行吗?
-
我会用我得到的错误更新我的帖子。函数和触发器都正确插入。只是当我用返回日期更新一行时,我收到一个错误。是的,我相信我想更新一行而不是插入一行。我不确定如何在更新查询中正确使用我的表达式。我们在一个小镇的便利店经营一家小型 DVD 出租店。所以我们仍然得到了很好的生意。感谢您迄今为止的帮助。
-
amount_owed 列是我希望表达式结果更新的位置。 update_cus_balance 是我创建的一个函数。
-
好的,我去日志,当我尝试更新一行时发现了这个错误。 “超出堆栈深度限制”。
标签: database postgresql