在创建基于变量更新列的触发器时遇到问题
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
之前的 colons
和 WHEN
语句中的 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;
祝你好运。
我正在尝试为 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
之前的colons
和WHEN
语句中的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;
祝你好运。