我正在尝试在更新主表时刷新视图。
视图使用主表中的字段作为数据透视。
因此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
但是触发器失败,因为“无法在触发器中提交”...
提交事务后是否有办法执行触发器? 或者有什么办法/其他方式/更好的方法来实现它?
答案 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;