2011-12-13 69 views
0

我有以下觸發:觸發功能IF-ELSE的Postgres

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$ 
BEGIN 
    IF (select number_itens from grup where NEW.gruop_id = group_id) != 0 THEN 
    UPDATE gruop SET number_itens= (number_itens-1) WHERE gruop_id=NEW.gruop_id; 
    END IF; 
RETURN NEW; 
END; $$ 
LANGUAGE plpgsql; 

CREATE TRIGGER deleted_item 
BEFORE DELETE ON item 
FOR EACH ROW EXECUTE PROCEDURE record_deleted_item(); 

在我的if-else子句我應該檢查是否從分組表的列值number_items不爲0。我怎麼能檢查呢?我完成的方式返回了一個錯誤。

回答

0

SELECT把它變成變量並比較爲零。您可能還想檢查SELECT是否實際返回了任何內容。

DECLARE 
    ni bigint; 
BEGIN 
    SELECT number_itens INTO ni FROM ...; 
    IF NOT FOUND THEN 
    END IF; 
    IF NI != 0 THEN 
    END IF; 
END 
+0

謝謝你,它的工作吧! – dextervip 2011-12-13 20:28:04

1

我不認爲你需要一個條件在那裏。如果沒有什麼grup匹配NEW.gruop_id = group_id當UPDATE只是不會做任何事情,所以沒有必要兩個查詢:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$ 
BEGIN 
    UPDATE gruop SET number_itens = (number_itens - 1) WHERE gruop_id = NEW.gruop_id; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

上述假設grup只是一個錯字,你只需要一gruop表。

而且,如果這真的是一個DELETE觸發器,那麼你會想用OLD代替NEW工作:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$ 
BEGIN 
    UPDATE gruop SET number_itens = (number_itens - 1) WHERE gruop_id = OLD.gruop_id; 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql;