0
CREATE FUNCTION update_status() RETURNS TRIGGER AS ' 
BEGIN 
SELECT status FROM animals
IF status = "Alive" 
THEN 
UPDATE animals SET status = "Sold" WHERE status="Alive";   
END IF;   
RETURN NULL; 
END; ' LANGUAGE plpgsql;  

CREATE TRIGGER updatetrigger AFTER UPDATE OF id_selling ON animals EXECUTE PROCEDURE     update_status(); 

選択した属性を使用していないので、Select の代わりに Perform を使用する必要があります。しかし、実行後にIFを認識しません。私はこれらの構文に本当に慣れていないので、間違っている可能性があります。私がやりたいことは明確だと思います(経験のある人にとっては簡単だと思います)。この問題について教えてください。

4

1 に答える 1

4

標準 SQL (および PostgreSQL) では、これは引用符で囲まれた識別子 (テーブル名、列名など) です。

"Alive"

これは文字列リテラルです。

'Alive'

文字列に間違った引用符を使用しているため、「不明な列」について苦情が寄せられます。

関数は通常、この種のことを避けるためにドル引用符で定義されます。

CREATE FUNCTION update_status() RETURNS TRIGGER AS $$
BEGIN 
    SELECT status FROM animals
    IF status = 'Alive' THEN 
        UPDATE animals SET status = 'Sold' WHERE status = 'Alive';   
    END IF;   
    RETURN NULL; 
END;
$$ LANGUAGE plpgsql;

トリガーは NEW および OLD にアクセスして、行の以前/現在の状態と、行の新規/更新された状態を表すため、SELECT を使用してステータスを見つけるのではなく、それらを参照する必要があります。

CREATE FUNCTION update_status() RETURNS TRIGGER AS $$
BEGIN 
    IF NEW.status = 'Alive' THEN 
        UPDATE animals SET status = 'Sold' WHERE status = 'Alive';   
    END IF;   
    RETURN NULL; 
END;
$$ LANGUAGE plpgsql;

その UPDATE の WHERE 句にももう少し必要な場合がありますがWHERE status = 'Alive'、少し広いようです。

于 2012-11-12T19:00:43.927 に答える