我正在做一个将船租给客户的项目,并根据他们输入的信息为他们提供船。我想在此项目的一个部分中创建一个触发器,该触发器基于你何时乘船离开还是何时返回,将计算出天数,然后将钱退还给客户余额或收取额外费用。我有这样的触发器设置-
CREATE OR REPLACE TRIGGER BALANCE_FEE
AFTER INSERT ON CHARTERS
FOR EACH ROW
DECLARE
FEE NUMBER;
ACL_DATE DATE;
EXP_DATE DATE;
GRP_ID NUMBER;
BEGIN
SELECT ACL_RETURN_DATE, EXP_RETURN_DATE, GRP_ID INTO ACL_DATE, EXP_DATE, GRP_ID FROM CHARTERS;
IF ACL_DATE > EXP_DATE
THEN
FEE := (ACL_DATE - EXP_DATE) * 75;
IF ACL_DATE < EXP_DATE
THEN
FEE := (ACL_DATE - EXP_DATE)* -20;
ELSE
FEE := 0;
END IF;
END IF;
UPDATE CUSTOMER
SET CUSTOMER.BALANCE = CUSTOMER.BALANCE + FEE
WHERE CUSTOMER.GRP_ID = GRP_ID;
END;
/
SHOW ERROR;
如果它也有帮助,那么这里有两个与此触发器相关的表。
CREATE TABLE CUSTOMER (
CUS_FNAME VARCHAR(20),
CUS_LNAME VARCHAR(20),
GENDER VARCHAR(20),
PHONENUM NUMBER(10),
CITY VARCHAR(20),
PARTY_COUNT INT,
GRP_ID VARCHAR(20) PRIMARY KEY,
BALANCE NUMBER);
CREATE TABLE CHARTERS (
CHARTER_ID VARCHAR(20),
BOAT_ID VARCHAR(20) REFERENCES BOAT(BOAT_ID),
GRP_ID VARCHAR(20) REFERENCES CUSTOMER(GRP_ID),
EXP_RETURN_DATE DATE,
ACL_RETURN_DATE DATE);
当我运行代码时,我得到此错误报告
INSERT INTO CHARTERS (CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID) VALUES ('T003','B003',DATE '2019-05-5',DATE '2019-05-07','G003')
Error report -
ORA-04091: table ADMIN_BF.CHARTERS is mutating, trigger/function may not see it
ORA-06512: at "ADMIN_BF.BALANCE_FEE", line 9
ORA-04088: error during execution of trigger 'ADMIN_BF.BALANCE_FEE'
这到底是什么问题?这与我的触发器是“插入后”有关吗?提前致谢。
你无法从当前正在更新的表中进行选择,因为它正在“变异”。代替SELECT
语句,执行以下操作:
acl_date := :new.acl_return_date;
exp_date := :new.exp_return_date;
grp_id := :new.grp_id;
其余代码应在此之后都可以。
感谢您的帮助。我现在遇到另一个错误,可能是处理日期减法。也许您也可以帮助我解决这个问题。插入图表(CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID)值('T003','B003',日期'2019-05-5',日期'2019-05-07','G003')错误报告-ORA -06502:PL / SQL:数字或值错误:字符到数字的转换错误ORA-06512:位于“ ADMIN_BF.BALANCE_FEE”的第11行ORA-04088:执行触发器“ ADMIN_BF.BALANCE_FEE”时出错
DATE文字必须采用YYYY-MM-DD格式;您发布的第一个不是(应该是05,而不是5)。当减去两个DATE值时,结果是它们之间相隔NUMBER天,因此这不成问题。
我刚刚解决了这个问题,但仍然可以解决。插入图表(CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID)值('T003','B003',日期'2019-05-05',日期'2019-05-07','G003')错误报告-ORA -06502:PL / SQL:数字或值错误:字符到数字的转换错误ORA-06512:在“ ADMIN_BF.BALANCE_FEE”行11中ORA-04088:执行触发器“ ADMIN_BF.BALANCE_FEE”时出错
哪条线是11号线?
第11行是ACL_DATE:=:NEW.ACL_RETURN_DATE之前的行;