【问题标题】:Update a column in a function using plpgsql使用 plpgsql 更新函数中的列
【发布时间】:2017-03-19 18:44:18
【问题描述】:

我正在 PostgreSQL 9.5 中编写一个触发器函数。当名为action_flag 的列从FALSE 更新为TRUE 时,会调用一个函数。

如果order_num 在某个表中,那么我希望继续从FALSE 更新到TRUE

否则,如果order_num 在其他表中,那么我想引发异常并阻止更新发生。

我需要在我的 IF 声明中编写 UPDATE 的帮助。 ELSEIF 部分按预期运行。

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;

【问题讨论】:

    标签: postgresql sql-update plpgsql database-trigger


    【解决方案1】:

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

    相关:

    【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2012-03-26
    • 2012-09-27
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多