Oracle 当状态为活动状态时,如何制作PL/SQL程序来更新学生费用?

Oracle 当状态为活动状态时,如何制作PL/SQL程序来更新学生费用?,oracle,plsql,Oracle,Plsql,我是PL/SQL的新手,我有一个名为STUDENT的表,它包含以下列:REGNO、NAME、FNAME、住所、费用、状态。 我想做的是当创建一个新记录时,如果学生住所,例如住所='TEXAS'和状态='ACTIVE',那么我想在费用方面给予50%的折扣。 这是我的密码: CREATE OR REPLACE TRIGGER MYTRIGGER BEFORE INSERT ON STUDENT FOR EACH ROW BEGIN IF :NEW.DOMICILE = 'TEXAS' AND :NE

我是PL/SQL的新手,我有一个名为STUDENT的表,它包含以下列:REGNO、NAME、FNAME、住所、费用、状态。 我想做的是当创建一个新记录时,如果学生住所,例如
住所='TEXAS'
状态='ACTIVE'
,那么我想在费用方面给予50%的折扣。 这是我的密码:

CREATE OR REPLACE TRIGGER MYTRIGGER
BEFORE INSERT ON STUDENT
FOR EACH ROW
BEGIN
IF :NEW.DOMICILE = 'TEXAS' AND :NEW.STATUS = 'ACTIVE' THEN
UPDATE STUDENT SET FEES = FEES - 0.50 * FEES;
END IF;
END MYTRIGGER;
/
触发器已创建,但无法正常工作。。 例如:


有什么建议吗?

您不需要这里的
update
语句,只需将新值设置为:new.FEES:

创建或替换触发器MYTRIGGER
在插入学生姓名之前
每行
开始
如果:NEW.resident='TEXAS'和:NEW.STATUS='ACTIVE',则
:NEW.FEES:=0.50*:NEW.FEES;
如果结束;
结束我的触发器;
/

您的触发器在编写时工作正常。但是,显然不是你想要或期望的。您想要的是将传入行的费用降低1/2。然而,你的期望是错误的。update语句实际做的是将表中任何一行的费用降低1/2。由于传入行不存在,因此它不参与更新。这就是为什么它似乎对一些但不是所有的插入都有效(事实上,我很惊讶,因为我预期会出现“ORA-04091:表正在变异…”异常)。原因是Update语句没有WHERE子句,所以它会更新每一行。查看一个小提琴,它通过在每次插入后显示表来显示正在发生的事情,以查看该语句实际上做了什么。当结果不符合预期时,通常是一种有用的技术@SayanMalakshinov是正确的:不要更新,只做一个赋值

:new.fees := :new.fees * .5;

“它不能正常工作”:请解释你的意思。如果您遇到错误,请编辑您的问题以包含错误的全部细节。@LukeWoodward好的,我编辑了问题,您可以检查问题中的示例。它给出了以下错误:
警告:使用编译错误创建触发器。SQL>显示错误;触发器MYTRIGGER的错误:行/列错误-------------------------------------------------------------------3/13 PLS-00103:在预期以下情况之一时遇到符号“=”:=。(@%;指示符“:=”已插入“=”之前以继续。SQL>
@BHS抱歉,修复了一个键入错误-添加了“:”
:new.fees := :new.fees * .5;