oracle 无法为实体化视图设置 ON COMMIT 刷新属性
时间: 2023-02-10 09:00:08 浏览: 86
对于实体化视图,不能设置 ON COMMIT 刷新属性。这是因为实体化视图是在创建时就将查询结果缓存下来的,所以无法在提交事务后刷新。如果希望在提交事务后刷新视图,可以使用普通的视图,并在创建时使用 WITH REFRESH 子句设置 ON COMMIT 刷新属性。
相关问题
Oracle物化视图增量刷新测试
以下是一个简单的Oracle物化视图增量刷新的测试:
1. 创建测试表和物化视图
```
-- 创建测试表
CREATE TABLE test_table (
id NUMBER,
name VARCHAR2(50),
value NUMBER
);
-- 插入测试数据
INSERT INTO test_table VALUES (1, 'A', 10);
INSERT INTO test_table VALUES (2, 'B', 20);
INSERT INTO test_table VALUES (3, 'C', 30);
-- 创建物化视图
CREATE MATERIALIZED VIEW test_mv
REFRESH FAST ON COMMIT
AS SELECT id, name, value FROM test_table;
```
2. 对测试表进行更改,查看物化视图是否增量刷新
```
-- 修改测试表数据
UPDATE test_table SET value = 40 WHERE id = 2;
-- 查询物化视图数据
SELECT * FROM test_mv;
-- 物化视图已经增量刷新,输出结果为:
ID NAME VALUE
1 A 10
2 B 40
3 C 30
```
在上述测试中,我们先创建了一个测试表和一个物化视图,并且将物化视图设置为在事务提交时进行增量刷新。然后,我们修改了测试表中的数据,并查询了物化视图的数据,发现物化视图已经增量刷新,更新了发生更改的数据。
oracle物化视图定时刷新
Oracle物化视图可以定时刷新,可以通过以下两种方式实现:
1. 使用DBMS_SCHEDULER定时刷新
可以使用DBMS_SCHEDULER包来创建一个作业(job),并将其与一个计划(schedule)相关联,以定时刷新物化视图。下面是一个例子:
```
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'refresh_mv_job',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_MVIEW.REFRESH(''my_materialized_view''); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; INTERVAL=1',
end_date => NULL,
enabled => TRUE,
comments => 'Job to refresh my_materialized_view daily'
);
DBMS_SCHEDULER.ENABLE('refresh_mv_job');
END;
```
这将创建一个名为“refresh_mv_job”的作业,其作用是每天定时刷新名为“my_materialized_view”的物化视图。
2. 使用DBMS_JOB定时刷新
另一种方法是使用DBMS_JOB包创建一个作业,以定时刷新物化视图。下面是一个例子:
```
DECLARE
v_jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => v_jobno,
what => 'BEGIN DBMS_MVIEW.REFRESH(''my_materialized_view''); END;',
next_date => SYSDATE,
interval => 'TRUNC(SYSDATE+1) + 5/24', --每天5点刷新
no_parse => TRUE
);
COMMIT;
END;
```
这将创建一个作业,其作用是每天5点定时刷新名为“my_materialized_view”的物化视图。