我有两张桌子(在postgres中) - 广告和日志。每次插入日志表后,根据操作,它应该增加ads表中列的计数。
我曾尝试编写一个触发器将调用的函数,但在尝试创建函数时会抛出错误。我是postgresql触发器和函数的新手,所以有人可以指出这有什么问题。
create function update_ad_count (action character(4), ad_id INT) returns void
as $$case when action='VIEW' then
(UPDATE ads SET views = (SELECT views+1 FROM ads WHERE id=ad_id), updated = now() WHERE id=ad_id;)
end;$$
language sql
我得到的错误是
ERROR: syntax error at or near "case"
LINE 2: as $$case when action=\'VIEW\' then
^
更新 @Tomalak:感谢您的功能和更新更新声明(无法抵抗双关语)。
我经过大量的谷歌搜索后了解到,该函数不应该有任何参数并使用NEW.col_name并且应该返回一个TRIGGER。
答案 0 :(得分:2)
首先,你的UPDATE调用应该是:
UPDATE ads SET views = views + 1, updated = NOW() WHERE id = ad_id;
根据the documentation,这样的事情应该这样做:
CREATE FUNCTION update_ad_count (action CHARACTER(4), ad_id INT)
RETURNS VOID
AS $$
BEGIN
IF action = 'VIEW' THEN
UPDATE ads SET views = views + 1, updated = NOW() WHERE id = ad_id;
END IF;
END;
$$ LANGUAGE plpgsql;
CASE不是流控制语句,不能像IF语句一样使用。它是一个产生价值的陈述(表达式),必须如此使用,例如你必须从中选择/更新。
答案 1 :(得分:0)
我对postgresql并不是很熟悉,但基于我所知道的......不应该是“$$ case”而不是“$$ case”吗?