如何使用触发器在PL / SQL中将值从一个表插入到另一个表

时间:2019-04-25 15:28:56

标签: 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_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.

2 个答案:

答案 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应用程序,存储过程中,还包括其他内容)。此外,如果您加载大量数据,它们将为每行触发 并降低所有速度。

简单地说,不要那样做。在需要时计算总计,这很可能是在演示阶段(即在某些报告中)。

使用触发器进行记录,小心处理用于其他所有内容。