2017-03-19 107 views
1

我正在PostgreSQL 9.5中編寫觸發器函數。當名爲action_flag的列從FALSE更新爲TRUE時,將調用一個函數。使用plpgsql更新函數中的列

如果order_num在某個表中,那麼我希望從FALSETRUE的更新繼續。

否則,如果order_num是在其他表中,那麼我想引發異常並阻止更新發生。

我需要幫助在我的IF聲明中編寫UPDATEELSEIF部分按預期運行。

CREATE OR REPLACE FUNCTION check_ingredient_availability() 
RETURNS TRIGGER AS 
$Body$ 
BEGIN 
    if (OLD.order_num IN (SELECT order_num 
        FROM can_prep_m_orders)) THEN 
     RAISE NOTICE 'This is a notice.'; 
     --UPDATE meal_order 
     --SET actioned_flag=TRUE 
     --WHERE order_num=OLD.order_NUM; 

     --EXECUTE 'UPDATE meal_order 
      -- SET actioned_flag=TRUE 
      --WHERE  order_num=$1' 
      --USING OLD.order_num; 
     RETURN NULL; 
    ELSEIF (OLD.order_num IN (SELECT order_num 
         FROM cannot_prep_m_orders)) THEN 
     RAISE EXCEPTION 'Missing ingredients. Cannot prepare order number %.', 
       OLD.order_num; 
     RETURN NULL; 
    ELSE 
     RETURN NULL; 
    END IF; 
END;  
$Body$ LANGUAGE plpgsql; 

回答

0

使用EXISTS

CREATE OR REPLACE FUNCTION check_ingredient_availability() 
    RETURNS TRIGGER AS 
$func$ 
BEGIN 
    IF EXISTS (
     SELECT 1 FROM can_prep_m_orders 
     WHERE order_num = NEW.order_num -- NEW !? 
     ) THEN 
     RAISE NOTICE 'This is a notice.'; 

     -- do nothing, let original UPDATE proceed 

     RETURN NEW; -- let UPDATE proceed 
    END IF; 

    IF EXISTS (
     SELECT 1 FROM cannot_prep_m_orders 
     WHERE order_num = NEW.order_num -- NEW!? 
     ) THEN 

     RAISE EXCEPTION 'Missing ingredients. Cannot prepare order number %.', NEW.order_num; 
             -- I assume you want to mention the *new* order_num? 
    END IF; 

    RETURN NULL; -- cancel original UPDATE in all other cases 
END 
$func$ LANGUAGE plpgsql; 

相關:

此外,添加一個WHEN子句的觸發器來運行這些檢查時

action_flagFALSE更新TRUE

CREATE TRIGGER your_trigger_name 
BEFORE UPDATE ON your_table 
FOR EACH ROW 
WHEN (NEW.action_flag AND NOT OLD.action_flag) 
EXECUTE procedure check_ingredient_availability(); 

相關:

+0

謝謝您的回覆,歐文。這非常有幫助! 我不知道那個RETURN NEW;是什麼允許更新繼續。 – Pizzas

+0

@Pizzas:[請閱讀本手冊的這一章。](https://www.postgresql.org/docs/current/static/plpgsql-trigger.html) –