Plsql 如何在PL/SQL中使用触发器将值从一个表插入到另一个表
我已经为一个表创建了一个触发器,但我想计算百分比并将其插入另一个表中,为此我需要创建另一个触发器这是从中获取总值的触发器:Plsql 如何在PL/SQL中使用触发器将值从一个表插入到另一个表,plsql,Plsql,我已经为一个表创建了一个触发器,但我想计算百分比并将其插入另一个表中,为此我需要创建另一个触发器这是从中获取总值的触发器: 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_
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.
试用
CREATE TRIGGER update_percentage
AFTER INSERT
ON item FOR EACH ROW
BEGIN
INSERT INTO students_percentage (SELECT sid, total FROM student_report);
END;
试用
CREATE TRIGGER update_percentage
AFTER INSERT
ON item FOR EACH ROW
BEGIN
INSERT INTO students_percentage (SELECT sid, total FROM student_report);
END;
执行某些操作的代码可能如下所示;首先,测试用例:
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>
另一方面,我建议你不要那样做。不要存储任何总计,因为它们维护起来很昂贵。例如,在
学生报告
表(我将其命名为trg\u stud\u rep
)上触发,并在删除之前触发,则不会执行任何操作;没有任何:新的值,只有:旧的值,因此如果您想获得准确的总计值,就必须小心。此外,您正在将其插入另一个表中
使用触发器很棘手;它们隐藏了业务逻辑,当出现问题时,您必须记住,您还将一些代码放入了触发器中(不仅仅是表单应用程序、存储过程等等)。此外,如果您加载了大量数据,它们会为每一行触发,并降低速度
简单地说,不要那样做。在需要时计算总数,这很可能是在演示阶段(即在某些报告中)
出于日志记录的目的使用触发器,处理其他事情时要小心。执行某些操作的代码可能如下所示;首先,测试用例:
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>
另一方面,我建议你不要那样做。不要存储任何总计,因为它们维护起来很昂贵。例如,在学生报告
表(我将其命名为trg\u stud\u rep
)上触发,并在删除之前触发,则不会执行任何操作;没有任何:新的值,只有:旧的值,因此如果您想获得准确的总计值,就必须小心。此外,您正在将其插入另一个表中
使用触发器很棘手;它们隐藏了业务逻辑,当出现问题时,您必须记住,您还将一些代码放入了触发器中(不仅仅是表单应用程序、存储过程等等)。此外,如果您加载了大量数据,它们会为每一行触发,并降低速度
简单地说,不要那样做。在需要时计算总数,这很可能是在演示阶段(即在某些报告中)
出于日志记录的目的使用触发器,小心处理所有其他内容。甚至无法编译的(应该是更新或插入
,值
应该删除)。甚至无法编译的(应该是更新或插入
,值
应该删除)。请检查触发器规范的语法。您应该先在
之后设置,然后在
上设置。在此之后,您将在insert语句中遇到另一个错误。此外,此触发器是一个事后语句触发器,它将在每次修改时插入所有总计,而无需首先清除表,也无需过滤,因此一旦触发器开始工作,它将迅速向项
表发送大量重复数据的垃圾邮件,您正在使用学生报告
中的数据更新学生百分比
,该数据来自项
上的触发器。为什么在项上
?请检查触发器规范的语法。您应该先在
之后设置,然后在
上设置。在此之后,您将在insert语句中遇到另一个错误。此外,此触发器是一个事后语句触发器,它将在每次修改时插入所有总计,而无需首先清除表,也无需过滤,因此一旦触发器开始工作,它将迅速向项
表发送大量重复数据的垃圾邮件,您正在使用学生报告
中的数据更新学生百分比
,该数据来自项
上的触发器。为什么要打开项
?