当我调用触发器更新 STUDENT 表中的总数时,Oracle 中的 SQL 出错
Posted
技术标签:
【中文标题】当我调用触发器更新 STUDENT 表中的总数时,Oracle 中的 SQL 出错【英文标题】:got error in SQL in my oracle when i call my trigger to update total in my STUDENT table 【发布时间】:2021-05-11 06:01:20 【问题描述】:我必须调用一个触发器,在插入查询后更新总计和百分比字段 这是代码
create table bhrugus1 (
student_name varchar2(100),
dbms number,
dsa number,
mco number,
total number,
percentage number,
roll_no number primary key
);
CREATE OR REPLACE TRIGGER trial1
AFTER INSERT on bhrugus1
REFERENCING new AS new
FOR EACH ROW
BEGIN
:new.total := :new.dbms + :new.dsa + :new.mco;
:new.percentage := (:new.dbms + :new.dsa + :new.mco) / 3 ;
END;
insert into bhrugus1 values ('bhrugu',90,90,90,1,1,2);
SELECT * from bhrugus1;
表格和运行触发器时出现错误
the new error
【问题讨论】:
看起来像这样***.com/questions/47584800/…。将您的“bhrugu”更改为“bhrugu” 我更新了我的代码得到了新的错误@Craig As documented in the manual PL/SQL 中的赋值运算符是:=
我现在更新它说“无法更改此触发器类型的新值”
触发器必须在插入之前而不是在插入之后。
【参考方案1】:
请修改您的触发器:
CREATE OR REPLACE TRIGGER trial1
before INSERT on bhrugus1
REFERENCING new AS new
FOR EACH ROW
BEGIN
:new.total := :new.dbms + :new.dsa + :new.mco;
:new.percentage := (:new.dbms + :new.dsa + :new.mco) / 3 ;
END;
您不应在触发器中运行更新语句,请使用 :new... 而不是更新。
另一个重要的事情是:
before insert
【讨论】:
我修改了答案:触发器在insert之前,赋值运算符为:=,正如a_horse_with_no_name所说。 它解决了错误,我之前和之前都这样做过【参考方案2】:您缺少一个组件,当有人更新任何或所有 dbms、dsa、mco 时会发生什么。没有更新触发器来重新计算总数或百分比。您当然可以在触发器上包含“或更新”。然而,更好的方法是将它们定义为虚拟列。
create table bhrugus1 (
student_name varchar2(100),
dbms number,
dsa number,
mco number,
total number generated always as (dbms+dsa+mco) virtual,
percentage number generated always as ((dbms+dsa+mco)/3) virtual,
roll_no number primary key
);
总和百分比(不好的名字是平均值 - 但这是另一个问题)将始终正确计算。并放下不再需要的触发器。
【讨论】:
以上是关于当我调用触发器更新 STUDENT 表中的总数时,Oracle 中的 SQL 出错的主要内容,如果未能解决你的问题,请参考以下文章
创建一个名为stu_insert的触发器,当向学生表student中插入记录时,自动更新班级表class中的学生人数numbe