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

Having trouble creating trigger that updates column based on variable

我正在尝试为 class 创建一个触发器,根据 return 编辑商品的延迟或提前天数来更新客户余额。我有一个章程 table,它有截止日期和 return 日期,触发器设计为仅在更新 return 日期时触发。然后触发器获取 return 日期和截止日期之间的差异,并将该值存储到一个变量中。我有一系列 if else 语句来确定该项目是 return 延迟还是提前,然后将天数乘以滞纳金或提前奖金。然后它将 customer table 中的客户余额更新为 fee 变量的任何值。 Oracle 说我的结束语句有语法错误,我不确定哪里出了问题。

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;

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

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_date 未定义(可以使用 :OLD.Due_Date:NEW.Due_Date
  • 应使用
  • ELSIF 而不是 ELSE IF
  • UPDATE 语句应以 semicolon 结束。
  • 删除 OLD 之前的 colonsWHEN 语句中的 NEW

我建议用 UPDATE 语句中的 CASE 表达式替换 IF/ELSIF 语句:

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;

祝你好运。