当我调用我的触发器更新我的 STUDENT table 中的总数时,我的 oracle SQL 出现错误

got error in SQL in my oracle when i call my trigger to update total in my STUDENT table

我必须调用一个触发器来在插入查询后更新总计和百分比字段 这是代码

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;

table 和 运行 触发时出现错误


the new error

请修改您的触发器:

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

您缺少一个组件,当有人更新任何或所有 dbms、dsa、mco 时会发生什么。没有更新触发器来重新计算总数或百分比。您当然可以只在触发器上包含 'OR UPDATE' 。然而,更好的方法是将它们定义为虚拟列。

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
); 

总计和百分比(糟糕的名字是平均值 - 但这是另一个问题)将始终正确计算。并删除不再需要的触发器。