簡體   English   中英

Postgres語法錯誤-觸發器

[英]Postgres Syntax Error - Triggers

我第一次使用觸發器,案例和存在,但無法找出問題所在。 我已將表名替換為響應者方便的屬性。

本質上,我想要的是:當我在時態表中插入一個條目時,

  • 如果新條目的主鍵已經存在於臨時表中,則我希望此新條目的開始日期為上一條記錄的結束日期。

  • 如果新條目對表來說是全新的,則什么也不會發生(插入操作照常進行)。

代碼是:

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(); 

關於在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM