【问题标题】:How to insert values from one table to another in PL/SQL using trigger如何使用触发器在 PL/SQL 中将值从一个表插入到另一个表
【发布时间】:2019-04-26 13:05:58
【问题描述】:

我已经为一个表创建了一个触发器,但我想计算百分比并将其插入另一个表中,为此我需要创建另一个触发器,这是我从中获取总值的触发器:

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.

【问题讨论】:

  • 请检查触发器规范的语法。您应该首先拥有after,然后是on。之后,您将在插入语句中遇到另一个错误。此外,此触发器是一个 after 语句触发器,它将插入所有总数,而无需先清除表且不过滤,在您所做的每一次修改中,因此一旦您让触发器工作,它会迅速向 item 表发送垃圾邮件有大量重复数据。
  • 进一步观察,您正在使用来自student_report 的数据更新students_percentage,来自item 的触发器。为什么选择item

标签: plsql


【解决方案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 应用程序、存储过程等)。此外,如果您加载大量数据,它们会为每一行触发 并减慢一切速度。

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

将触发器用于记录目的,小心处理其他一切。

【讨论】:

    【解决方案2】:

    尝试使用

    CREATE TRIGGER update_percentage
    AFTER INSERT
    ON item FOR EACH ROW
    BEGIN
    INSERT INTO students_percentage (SELECT sid, total FROM student_report);
    END;
    

    【讨论】:

    • 那甚至不能编译(应该是update or insertvalues应该被删除)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2021-11-16
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多