表更新后执行触发器

时间:2015-08-06 11:46:14

标签: stored-procedures plsql oracle11g triggers

我正在尝试在更新主表时刷新视图。

视图使用主表中的字段作为数据透视。

因此CREATE VIEW过程需要主表中的已提交值:

mastertable:
id      tipusVal
----------------
 1      val1
 2      val2
 3      val3

variacionsTemps table:
id  tipusVal  valor  mes
------------------------
1    val1     10     3
2    val1     10     4
3    val3     2      4
4    val1     10     5
5    val2     9      5
6    val1     6      5

resum view:
mes  sum_val1   sum_val2   sum_val3
-----------------------------------
3    10         0          0
4    10         0          2
5    16         9          0

因此,当更新主表时,应重新创建视图。 现在我已经设法使用PRAGMA AUTONOMOUS_TRANSACTION执行“创建或替换视图”过程,但我发现该过程是从mastertable获取旧值。

触发:

CREATE OR REPLACE TRIGGER RCREATE_RESUM
AFTER DELETE OR INSERT OR UPDATE OF tipusVal ON mastertable
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  CREATE_RESUM_VIEW();
END;

步骤:

CREATE OR REPLACE PROCEDURE CREATE_RESUM_VIEW AS
  mAggCols VARCHAR2(2048);
  mStmt VARCHAR2(2048);
BEGIN

  SELECT LISTAGG('SUM(CASE WHEN tipusVal=''' || tipusVal || ''' THEN valor ELSE 0 END) AS sum_' || tipusVal , ',') WITHIN GROUP (ORDER BY id)
  INTO mAggrCols
  FROM mastertable;

  mStmt := 'CREATE OR REPLACE VIEW RESUM AS SELECT mes, ' || mAggrCols || ' FROM variacionsTemps GROUP BY mes';

  EXECUTE IMMEDIATE mStmt;
END CREATE_RESUM_VIEW;

我一直在阅读in the oracle docs,我知道主要事务会在触发器完成之前停止,因此这就是为什么值不会更新的原因。所以我试图删除PRAGMA AUTONOMOUS_TRANSACTION但是触发器失败,因为“无法在触发器中提交”...

提交事务后是否有办法执行触发器? 或者有什么办法/其他方式/更好的方法来实现它?

1 个答案:

答案 0 :(得分:0)

事实上我找到了DBMS_JOB.SUBMIT的解决方案:

CREATE OR REPLACE TRIGGER RCREATE_RESUM
AFTER DELETE OR INSERT OR UPDATE OF tipusVal ON mastertable
DECLARE
  jobNum NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT(
    jobNum,
    'BEGIN CREATE_RESUM_VIEW(); END;',
    SYSDATE);
END;