3

変更されたレコード値を更新する関数を定義しています。

CREATE FUNCTION update_project_status_away_from_started()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.status = 'started' THEN
    NEW.status = 'updating';
    RETURN NEW;
  END IF;
RETURN OLD;
END;
$$ language 'plpgsql';

ただし、行を更新すると、次のエラーが発生します。

ERROR: operator does not exist: projectstatus = character varying

列挙型は次のように定義されます。

CREATE TYPE projectstatus AS ENUM ('started', 'updating', 'complete');

これについての私の理解は、列挙型が文字列と比較されており、何をすべきかわからないということです。残念ながら、文字列 ('started') を列挙型にキャストする方法がわかりません。http://www.postgresql.org/docs/9.1/static/datatype-enum.htmlの postgresql ページは、あまり役に立ちません。誰でも何か考えがありますか?

4

2 に答える 2

9

Postgres は、次のようにキャストする必要があると不平を言っています。

IF OLD.status = 'started'::projectstatus THEN
  NEW.status := 'updating'::projectstatus;
  RETURN NEW;
END IF;

また、Igor の回答に記載されているように、従来の (非推奨ですが、まだ機能している)代入演算子:=ではなく、代入に使用することをお勧めします。=

于 2013-05-05T11:55:19.743 に答える