【问题标题】:Execute trigger after table update表更新后执行触发器
【发布时间】:2015-10-29 13:16:27
【问题描述】:

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

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

所以 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 执行“创建或替换视图”过程,但我发现该过程正在从主表中获取旧值。

触发器:

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,但随后触发器失败,因为“无法在触发器中提交”...

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

【问题讨论】:

  • 您可以查找动态 PIVOT 技术,而不是尝试重建此视图
  • 动态 PIVOT 用于已知列(我知道我可以使用 PIVOT XML,但我需要这些列来解析 xml 结果,而且它的查看速度可能非常慢)。这里的主要问题是我在创建视图时不知道要旋转的列。
  • 我认为 Ask Tom 对枢轴中的未知列有一些解决方案。
  • 拜托,你能指出这篇文章吗?我一直在寻找这个解决方案,但没有找到,我想知道未知列名的枢轴(不是 xml)解决方案

标签: stored-procedures plsql oracle11g triggers


【解决方案1】:

其实我用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2012-02-02
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多