0

我有两个表(在 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。

4

2 回答 2

2

首先,您的 UPDATE 调用应该是:

UPDATE ads SET views = views + 1, updated = NOW() WHERE id = ad_id;

根据文档,应该这样做:

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 语句那样使用。它是一个产生价值的语句(一个表达式)并且必须按原样使用,例如,您必须从中选择/更新。

于 2009-01-26T16:49:50.097 回答
0

我对postgresql不是很熟悉,但根据我所知道的......不应该是“$$ case”而不是“$$case”吗?

于 2009-01-26T16:41:22.237 回答