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语句中遇到另一个错误。此外,此触发器是一个事后语句触发器,它将在每次修改时插入所有总计,而无需首先清除表,也无需过滤,因此一旦触发器开始工作,它将迅速向
表发送大量重复数据的垃圾邮件,您正在使用
学生报告
中的数据更新
学生百分比
,该数据来自
上的触发器。为什么要打开