0

広告とログの 2 つのテーブル (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: 関数と update ステートメントの更新に感謝します (駄洒落に抵抗できませんでした)。

多くのグーグル検索の結果、関数にはパラメーターがなく、NEW.col_name を使用し、TRIGGER を返す必要があることがわかりました。

4

2 に答える 2

2

まず、UPDATE 呼び出しは次のようになります。

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

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 ステートメントのように使用することはできません。これは値を生成するステートメント (式) であり、そのように使用する必要があります。たとえば、そこから SELECT/UPDATE する必要があります。

于 2009-01-26T16:49:50.097 に答える
0

私はpostgresqlにあまり詳しくありませんが、私が知っていることに基づいて...「$$ケース」ではなく「$$ケース」であるべきではありませんか?

于 2009-01-26T16:41:22.237 に答える