我已经为一个表创建了一个触发器,但是我想计算百分比并将其插入到另一个表中,为此,我需要创建另一个触发器,这是从中获取总价值的触发器:
CREATE OR REPLACE TRIGGER stud_rep
BEFORE DELETE OR INSERT OR UPDATE ON student_report
FOR EACH ROW
BEGIN
:new.total := :new.sub1 + :new.sub2 + :new.sub3;
END;
/
这是我要计算和存储来自student_report表的百分比和sid的另一个表。
SQL> DESC students_percentage;
Name Null? Type
----------------------------------------- -------- ----------------------------
SID NUMBER(3)
TOTAL_PER NUMBER(2)
这是我尝试的代码:
SQL> CREATE TRIGGER update_percentage
2 ON item
3 AFTER UPDATE,INSERT
4 AS
5 BEGIN
6 INSERT INTO students_percentage VALUES(SELECT sid, total FROM student_report);
7 END;
8 /
ON item
*
ERROR at line 2:
ORA-04071: missing BEFORE, AFTER or INSTEAD OF keyword
SQL> SHOW ERROR;
No errors.
答案 0 :(得分:1)
尝试使用
CREATE TRIGGER update_percentage
AFTER INSERT
ON item FOR EACH ROW
BEGIN
INSERT INTO students_percentage (SELECT sid, total FROM student_report);
END;
答案 1 :(得分:1)
执行某些操作的代码可能看起来像这样;首先,测试用例:
SQL> create table item (sid number);
Table created.
SQL> create table student_report(sid number, total number, sub1 number, sub2 number, sub3 number);
Table created.
SQL> create table students_percentage (sid number, total_per number);
Table created.
SQL>
触发器:
SQL> create or replace trigger trg_stud_rep
2 before delete or insert or update on student_report
3 for each row
4 begin
5 :new.total := :new.sub1 + :new.sub2 + :new.sub3;
6 end;
7 /
Trigger created.
SQL> create or replace trigger trg_update_percentage
2 after update or insert on item
3 for each row
4 begin
5 insert into students_percentage (sid, total_per)
6 select sid, total from student_report
7 where sid = :new.sid;
8 end;
9 /
Trigger created.
SQL>
测试:
SQL> insert into student_report (sid, sub1, sub2, sub3) values (100, 1, 2, 3);
1 row created.
SQL> insert into item (sid) values (100);
1 row created.
SQL> select * From item;
SID
----------
100
SQL> select * From student_report;
SID TOTAL SUB1 SUB2 SUB3
---------- ---------- ---------- ---------- ----------
100 6 1 2 3
SQL> select * From students_percentage;
SID TOTAL_PER
---------- ----------
100 6
SQL>
另一方面,我建议您不这样做。不要存储任何总计,因为它们维护成本很高。例如,在student_report
表上触发(我将其命名为trg_stud_rep
),并在DELETE
不执行任何操作之前触发;没有任何:new
值,只有:old
个值,因此,如果要获得准确的total
值,则必须多加注意。而且,您要将其插入到另一个表中。
使用触发器非常棘手;它们隐藏了业务逻辑,并且-当出现问题时-您必须记住,您也将一些代码放入了触发器中(不仅包括到Forms应用程序,存储过程中,还包括其他内容)。此外,如果您加载大量数据,它们将为每行触发 并降低所有速度。
简单地说,不要那样做。在需要时计算总计,这很可能是在演示阶段(即在某些报告中)。
使用触发器进行记录,小心处理用于其他所有内容。