代码之家  ›  专栏  ›  技术社区  ›  Vanir

创建基于变量更新列的触发器时遇到问题

  •  0
  • Vanir  · 技术社区  · 8 年前

    我正在尝试为一个类创建一个触发器,该类根据项目延迟或提前返回的天数来更新客户余额。我有一个charter表,它有到期日期和归还日期,触发器设计为仅在归还日期更新时触发。然后触发器获取返回日期和到期日期之间的差值,并将该值存储到变量中。我有一系列的if-else语句来确定物品是迟交还是早交,然后用天数乘以滞纳金或早交奖金。然后,它将客户表中的客户余额更新为费用变量的任何值。Oracle说我的end语句有语法错误,我不确定是什么错了。

    CREATE OR REPLACE TRIGGER Fee_Trigger
    AFTER UPDATE ON CHARTER
    FOR EACH ROW 
    WHEN ((:NEW.Return_Date <> :OLD.Return_Date AND :NEW.Return_Date IS NOT 
    NULL))
    DECLARE
    Fee NUMBER; 
    BEGIN 
    Fee := (:NEW.Return_Date - Due_Date); 
    IF Fee > 0 THEN Fee := (Fee * 75) ;
    ELSE IF Fee < 0 THEN Fee := (Fee * 25);
    ELSE IF Fee = 0 THEN FEE := Fee;
    END IF;
    UPDATE CUSTOMER 
    SET Customer_Balance = Fee
    WHERE CustomerID = :NEW.CustomerID
    END;
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Barbaros Özhan    8 年前

    有一些小的格式错误。也可以使用以下选项:

    CREATE OR REPLACE TRIGGER Fee_Trigger
    AFTER UPDATE ON CHARTER
    FOR EACH ROW 
    WHEN ((NEW.Return_Date <> OLD.Return_Date AND NEW.Return_Date IS NOT NULL))
    DECLARE
     Fee NUMBER; 
    BEGIN 
     Fee := :NEW.Return_Date - :NEW.Due_Date; 
    
     IF    Fee > 0 THEN Fee := (Fee * 75); 
     ELSIF Fee < 0 THEN Fee := (Fee * 25);
     ELSIF Fee = 0 THEN Fee := Fee;
     END IF;
    
     UPDATE CUSTOMER 
        SET Customer_Balance = Fee
      WHERE CustomerID = :NEW.CustomerID;
    
    END;
    

    遇到以下问题:

    • 未定义Due\u日期( :OLD.Due_Date :NEW.Due_Date 可使用)
    • ELSIF 应使用,而不是 ELSE IF
    • UPDATE 语句应以 semicolon
    • 去除 colons 之前 OLD NEW 在…内 WHEN 陈述
        2
  •  0
  •   Bob Jarvis - Слава Україні    8 年前

    我建议更换 IF/ELSIF UPDATE语句中包含大小写表达式的语句:

    CREATE OR REPLACE TRIGGER Fee_Trigger
      AFTER UPDATE ON CHARTER
      FOR EACH ROW 
      WHEN ((:NEW.Return_Date <> :OLD.Return_Date AND :NEW.Return_Date IS NOT NULL))
    DECLARE
      Due_Date                      DATE := TRUNC(SYSDATE); -- initialization as an example value.
      nDays_between_return_and_due  NUMBER;
    BEGIN
      nDays_between_return_and_due := TRUNC(:NEW.Return_Date - Due_Date);
    
      UPDATE CUSTOMER 
        SET Customer_Balance = CASE
                                 WHEN nDays_between_return_and_due > 0 THEN  -- Returned late
                                   nDays_between_return_and_due * 75
                                 WHEN nDays_between_return_and_due < 0 THEN  -- Returned early
                                   nDays_between_return_and_due * 25
                                 ELSE  -- Returned on time
                                   0
                               END
        WHERE CustomerID = :NEW.CustomerID;
    END FEE_TRIGGER;
    

    祝你好运。