【发布时间】: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