当我调用触发器更新 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

创建一个触发器,当另一个表中的列更新时更新一个表上的列

ObservableCollection.CollectionChanged 未触发

MySQL 触发器用于在更新当前表中的值时更新另一个表

当表中的任何值被更新时触发函数更新时间戳属性