【问题标题】:If Else Condition at Trigger in Oracle SQLOracle SQL 中触发器的 If Else 条件
【发布时间】:2012-12-11 11:32:12
【问题描述】:

我有两张桌子。它们是

CARD(cardid, credit, usertype,charge)

PAYMENTDEVICE(paydevid, paydevip,paydevdate, paydevtime, chargedcardid, mealtype). 

膳食类型可以是“客人”或“标准”。当在支付设备中插入新行时,我想更新卡表中的信用。费用取决于用户类型。但是如果用餐类型是客人,每个人都必须支付5美元。我尝试使用以下代码

CREATE OR REPLACE TRIGGER  "TRG_PAYMONEY" 
AFTER INSERT
ON PAYMENTDEVICE FOR EACH ROW

BEGIN
UPDATE CARD
WHERE CARDID = :NEW.CHARGEDCARDID
SET CREDIT = 
(CASE MEALTYPE

WHEN "STANDARD" THEN CREDIT - CHARGE
WHEN "GUEST" THEN CREDIT - 5
END);
END;

但我收到此错误: PL/SQL: ORA-00971: missing SET keyword, PL/SQL: SQL Statement ignored。你能帮帮我吗?

【问题讨论】:

    标签: sql database oracle triggers


    【解决方案1】:

    好吧,经过一番研究,感谢Oracle Documentation,我们解决了这个实现的问题:

    CREATE OR REPLACE TRIGGER  "TRG_PAYMONEY" 
    AFTER INSERT
    ON PAYMENTDEVICE FOR EACH ROW
    
    BEGIN
    IF :NEW.MEALTYPE='GUEST' THEN
    UPDATE CARD
    SET CREDIT = CREDIT - 5
    WHERE CARDID = :NEW.CHARGEDCARDID;
    ELSE
    UPDATE CARD
    SET CREDIT = CREDIT - CHARGE
    WHERE CARDID = :NEW.CHARGEDCARDID;
    END IF;
    END;
    

    感谢您的帮助和建议。

    【讨论】:

      【解决方案2】:

      请运行此代码..

      CREATE OR REPLACE TRIGGER TRG_PAYMONEY1
      AFTER INSERT ON PAYMENTDEVICE 
      FOR EACH ROW
      BEGIN
      UPDATE CARD c
      SET c.credit=(select case when p.mealtype='STANDARD' then c.credit-c.charge
                       when p.mealtype='GUEST' then c.credit-5
                  end result from PAYMENTDEVICE p,card c
                 where c.cardid=p.chargedcardid)
      WHERE CARDID = :NEW.CHARGEDCARDID;
      END;
      

      【讨论】:

      • 它仍然给出错误 ORA-04091:表 SYSTEM.PAYMENTDEVICE 正在变异,触发器/函数可能看不到它 ORA-06512:在“SYSTEM.TRG_PAYMONEY1”,第 2 行 ORA-04088:错误期间触发器“SYSTEM.TRG_PAYMONEY1”的执行
      【解决方案3】:

      按照此语法进行更新,

      update table_name set field1='value' where field2='value'
      

      (即)

      UPDATE CARD
      SET CREDIT = 
      (CASE MEALTYPE
      WHEN "STANDARD" THEN CREDIT - CHARGE
      WHEN "GUEST" THEN CREDIT - 5
      END)
       WHERE CARDID = :NEW.CHARGEDCARDID;
      

      有关'update' 语句的工作原理的更多信息,请参阅此文档,

      http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/update_statement.htm

      对于你的第二个错误,试试这个,

      UPDATE CARD
      SET CREDIT = 
      (CASE 
      WHEN MEALTYPE="STANDARD" THEN CREDIT - CHARGE
      WHEN MEALTYPE="GUEST" THEN CREDIT - 5
      END MEALTYPE) 
       WHERE CARDID = :NEW.CHARGEDCARDID;
      

      类似的,

      update card c
      set c.credit=(select case when p.mealtype='STANDARD' then c.credit-c.charge
                       when p.mealtype='GUEST' then c.credit-5
                  end credit from PAYMENTDEVICE p
                 where c.cardid=p.chargedcardid)
      

      fiddle_demo

      【讨论】:

        【解决方案4】:

        您的更新声明应该是(WHERE 应该在 SET 之后)

        UPDATE CARD
        SET CREDIT = 
        (CASE MEALTYPE
        
        WHEN "STANDARD" THEN CREDIT - CHARGE
        WHEN "GUEST" THEN CREDIT - 5
        WHERE CARDID = :NEW.CHARGEDCARDID
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-08
          • 2016-04-09
          相关资源
          最近更新 更多