PLSQL中使用的Oracle dba\u快照\u刷新\u时间
基本上,我有一个MVIEW,它不需要每次运行报告时都刷新,因此作为一个测试,我只是检查分钟间隔,如果它在过去20分钟内没有刷新,我会刷新它。因此,如果我单独运行此脚本,它将正常工作:PLSQL中使用的Oracle dba\u快照\u刷新\u时间,oracle,oracle11g,oracle-sqldeveloper,Oracle,Oracle11g,Oracle Sqldeveloper,基本上,我有一个MVIEW,它不需要每次运行报告时都刷新,因此作为一个测试,我只是检查分钟间隔,如果它在过去20分钟内没有刷新,我会刷新它。因此,如果我单独运行此脚本,它将正常工作: declare LastRefresh float; myvar varchar2(10) := 'NO'; BEGIN SELECT ROUND(ABS((LAST_REFRESH - SYSDATE)*24*60),0) INTO LastRefresh
declare
LastRefresh float;
myvar varchar2(10) := 'NO';
BEGIN
SELECT ROUND(ABS((LAST_REFRESH - SYSDATE)*24*60),0)
INTO LastRefresh
FROM dba_snapshot_refresh_times
WHERE owner = 'ME'
AND NAME = 'MATV_ADDRESS';
IF (LastRefresh > 20)
THEN BEGIN myvar := 'YES'; END;
--// THIS IS WHERE I WOULD REFRESH THE MVIEW
END IF;
dbms_output.put_line(myvar);
END;
/
我遇到的问题是,当我尝试在Oracle过程中运行此操作时,在dba\u snapshot\u refresh\u times上得到“表或视图不存在”。我执行executeimmediate来调用查询,但似乎找不到使用此方法插入变量的方法。我有没有其他干净的方法可以做到这一点
我做了一点研究,在那里我可能只使用一些其他形式的“标志”,我会填充一个临时表来检查值,但我想我会问一个更干净的方法/解决方案。看起来你在编程Oracle自己提供的东西;为什么不将物化视图设置为每20分钟自动刷新一次?你会用
alter materialized view matv_address
refresh
next sysdate + 20 / (60 * 24);
至于您的问题(如果我正确理解了这个问题):DBA视图对于具有DBA权限的用户是可见的。您连接的用户似乎没有这些权限。相反,您可以使用用户快照刷新次数(对于属于您的物化视图)或所有快照刷新次数(对于您有权访问但也属于其他用户的物化视图)。在这个线程中找到了我的答案,我只是使用一个替代表(所有视图)来获取“上次刷新日期”,因此,这似乎在Oracle过程中起作用
SELECT ROUND(ABS((LAST_REFRESH_DATE - SYSDATE)*24*60),0)
INTO LastRefresh
FROM all_mviews
WHERE owner = 'ME'
AND mview_name = 'MATV_ADDRESS';
IF (LastRefresh > 20) THEN
BEGIN
DBMS_SNAPSHOT.REFRESH(
LIST => 'MATV_ADDRESS'
,PUSH_DEFERRED_RPC => TRUE
,REFRESH_AFTER_ERRORS => FALSE
,PURGE_OPTION => 1
,PARALLELISM => 1
,HEAP_SIZE => 1
,ATOMIC_REFRESH => FALSE
,NESTED => FALSE);
END;
END IF;
您是否可以访问
dba\u快照\u刷新\u次
,而不是直接访问您的用户?如Littlefoot所述,如果您只查看自己的对象,权限较低的版本(例如,用户\u快照\u刷新\u次
)就足够了。我不确定其他人真正想问的是什么-什么标志?我在尝试运行脚本或编译过程时与同一用户登录,如果这是您的意思的话。还尝试在该特定表上向我的用户“授予SELECT”,但当时不起作用。我认为使用ALL_MVIEWS表可以解决我的问题,现在就运行一些测试;你跟踪链接了吗?在具有默认authid设置的存储过程中,未启用通过角色授予的权限。感谢您的输入,我也不知道我可以直接在MVIEW属性中以这种方式安排更新,很高兴知道!我刚刚找到了一个替代表(ALL_MVIEWS),其中包含最后一个_REFRESH_日期,并且似乎在过程中起作用。将运行更多的测试以确认。