2016-10-17 69 views
0

我第一次使用觸發器,案例和存在,並不能找出問題。我已經替換了表名是屬性,以方便響應者。Postgres語法錯誤 - 觸發器

從本質上講,我想的是:當我插入一個條目,以我的態表,

  • 如果新條目的主鍵在顳表已經存在,我想這個新條目的開始日期成爲之前記錄的結束日期。

  • 如果新條目對錶完全是新的,則不會發生任何事情(插入操作如常)。

的代碼是:

CREATE OR REPLACE FUNCTION update_End_Date() 
    RETURNS trigger AS 
$$ 
BEGIN 

    SELECT CASE 
    WHEN EXISTS (SELECT TemporalTable.primaryKey FROM TemporalTable WHERE primaryKey = NEW.primaryKey) 
    THEN 
     UPDATE 
      TemporalTable 
    SET 
     TemporalTable.DtEnd = NEW.DtStart 
    WHERE 
     TemporalTable.PrimaryKey = NEW.PrimaryKey AND 
     TemporalTable.DtEnd IS NULL 
     ; 
    END 

    RETURN NEW; 
RETURN NEW; 
END; 

$$ 
LANGUAGE 'plpgsql'; 


CREATE TRIGGER update_End_Date 
    BEFORE INSERT 
    ON Table1 
    FOR EACH ROW 
    EXECUTE PROCEDURE update_End_Date(); 
+0

你有什麼問題?有錯誤嗎?如果是這樣,請提供錯誤詳細信息。 – Nicarus

回答

0

您有在SELECT聲明中關於使用CASE條款的概念上的錯誤:你評估一些條件,以產生用於選擇列表的輸出。相反,您可以像使用過程式語言(如C)那樣將其用作邏輯分支操作。由於觸發總是被寫入在plpgsql程序語言就可以很容易地改寫的觸發函數如下:

CREATE OR REPLACE FUNCTION update_End_Date() RETURNS trigger AS $$ 
BEGIN 
    PERFORM * FROM TemporalTable WHERE primaryKey = NEW.primaryKey; 
    IF FOUND THEN 
     UPDATE TemporalTable 
     SET DtEnd = NEW.DtStart 
     WHERE PrimaryKey = NEW.PrimaryKey AND DtEnd IS NULL; 
    END IF; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

PERFORM命令檢查,如果一些數據存在而不返回任何數據並設置FOUND隱變量truefalse然後你可以檢查。

但是,如果這是您的觸發器功能中的所有邏輯(即沒有任何零件您不在此處顯示),您可以簡單地忽略檢查並直接執行UPDATE:如果沒有記錄用於更新,則沒有任何反應,觸發功能只是繼續:

CREATE OR REPLACE FUNCTION update_End_Date() RETURNS trigger AS $$ 
BEGIN 
    UPDATE TemporalTable 
    SET DtEnd = NEW.DtStart 
    WHERE PrimaryKey = NEW.PrimaryKey AND DtEnd IS NULL; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql;