在触发器内插入之前和之后的表的计数

时间:2015-02-26 05:50:02

标签: oracle plsql

是否可以在发生任何更改之前检查表的计数以及插入后的计数并在同一触发器内匹配它们?

对于ex:old.count和new.count(插入前后)?

1 个答案:

答案 0 :(得分:0)

  

old.count和new.count(插入前后)

在插入触发器之前,没有什么能阻止您使用SELECT COUNT(*)。当然,你不会在插入后触发器中执行此操作,因为定义了后触发器的同一个表上的select count(*)会抛出变异表错误。一种方法是自主交易。但是,在你的情况下,它并不复杂。

您可以定义 BEFORE INSERT TRIGGER 并获取表计数。实际插入完成后,可以手动进行插入后计数。

例如,我有一个包含一行的表t1。我在其上定义了一个before insert触发器,它会在插入发生之前为我提供表计数。

SQL> DROP TABLE t1 PURGE;

Table dropped.

SQL>
SQL> CREATE TABLE t1 (A NUMBER);

Table created.

SQL>
SQL> INSERT INTO t1 VALUES (1);

1 row created.

SQL>
SQL> SELECT * FROM t1;

         A
----------
         1

SQL>
SQL> CREATE OR REPLACE TRIGGER trg
  2  BEFORE INSERT
  3  ON t1
  4  FOR EACH ROW
  5
  6  DECLARE
  7   val number;
  8  BEGIN
  9    SELECT COUNT(*)
 10    INTO val
 11    FROM t1;
 12
 13  DBMS_OUTPUT.PUT_LINE('TABLE COUNT BEFORE INSERT = '||val);
 14
 15  END;
 16  /

Trigger created.

SQL>
SQL> set serveroutput on
SQL> INSERT INTO t1 VALUES (1);
TABLE COUNT BEFORE INSERT = 1

1 row created.

SQL>
SQL> SELECT COUNT(*) FROM t1;

  COUNT(*)
----------
         2

SQL>

所以,你看到TABLE COUNT BEFORE INSERT = 1,然后在插入后,计数是2。