Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PLSQL中使用的Oracle dba\u快照\u刷新\u时间_Oracle_Oracle11g_Oracle Sqldeveloper - Fatal编程技术网

PLSQL中使用的Oracle dba\u快照\u刷新\u时间

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

基本上,我有一个MVIEW,它不需要每次运行报告时都刷新,因此作为一个测试,我只是检查分钟间隔,如果它在过去20分钟内没有刷新,我会刷新它。因此,如果我单独运行此脚本,它将正常工作:

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_日期,并且似乎在过程中起作用。将运行更多的测试以确认。