2009-01-26 52 views
0

我有兩個表格(在postgres中) - 廣告和日誌。在每次插入日誌表後,根據操作,它應該增加廣告表中列的數量。在postgres插入期間觸發更新列

我試圖寫一個觸發器將調用的函數,但它嘗試創建該函數時會引發錯誤。我是新來的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

我不確定返回觸發器的函數是什麼。在我的理解中,觸發器是被定義的,而不是由函數返回的,但是我對postgres的瞭解並不多,所以我很高興至少得到UPDATE語句。 ;-) – Tomalak 2009-01-26 19:18:08

+0

謹慎地更新我的答案與您的發現,所以通過谷歌來到這裏的其他人發現他們可以立即使用的東西? – Tomalak 2009-01-26 19:18:49

回答

2

首先,你的更新調用應該是:

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; 

情況下不流控制語句,它不能是像IF語句一樣使用。它是一種產生價值的聲明(表達),並且必須如此使用,例如,你必須從中選擇/更新。

0

我對postgresql並不是很熟悉,但基於我所知道的......不應該是「$$ case」而不是「$$ case」嗎?