我需要知道在Oracle上定期运行查询的最佳实践是什么(我使用的是11g).
在我的特定用例中,我在表x中指定了DUE_DATE.我想要做的是每天00:01运行一个查询来计算某些记录的状态(OK,Warn,Critical或Overdue).特定记录的状态是从今天的日期(其中’今天’是查询运行的那天)相对于x.DUE_DATE计算的,并且某些用户指定的值表示’warn’和’critical'(包含在表中) Y).
>好的 – >今天< x.DUE_DATE - y.WARN
>警告 – >今天> = x.DUE_DATE – y.WARN和今天< x.DUE_DATE - y.CRITICAL
>严重 – >今天> = x.DUE_DATE – y.CRITICAL和今天< = x.DUE_DATE
>逾期 – >今天> x.DUE_DATE
定期运行此查询的最佳方法是什么?我找到了以下选项但不确定哪个最适合我的用例:
> Materialized Views
> DBMS_SCHEDULER
我知道我可以根据每个用户请求动态计算状态,但由于停顿只会每天更改一次,我认为进行计算更有效,并且每天一次缓存后续结果.
提前谢谢了.
>对于运行作业(和查询),DBMS_SCHEDULER是可供选择的工具.因此,如果要根据查询结果更新表中的状态,请使用
DBMS_SCHEDULER.
原文链接:https://www.f2er.com/oracle/205353.html例如,您可以安排执行以下更新的作业:
update x set status = (CASE WHEN sysdate < x.DUE_DATE - y.WARN THEN 'Ok' WHEN sysdate >= x.DUE_DATE - y.WARN and today < x.DUE_DATE - y.CRITICAL THEN 'Warn' WHEN sysdate >= x.DUE_DATE - y.CRITICAL and sysdate <= x.DUE_DATE THEN 'Critical' WHEN sysdate > x.DUE_DATE THEN 'Overdue' END) ;
要创建每天00:00安排的作业:
BEGIN dbms_scheduler.create_job(job_name => 'Status Updater',job_type => 'PLsql_BLOCK',job_action => ' BEGIN update x set status = (CASE WHEN sysdate < x.DUE_DATE - y.WARN THEN ''Ok'' WHEN sysdate >= x.DUE_DATE - y.WARN and today < x.DUE_DATE - y.CRITICAL THEN ''Warn'' WHEN sysdate >= x.DUE_DATE - y.CRITICAL and sysdate <= x.DUE_DATE THEN ''Critical'' WHEN sysdate > x.DUE_DATE THEN ''Overdue'' END) ; END;',start_date => systimestamp,repeat_interval => 'FREQ=DAILY;INTERVAL=1;BYHOUR=0;BYMINUTE=0;',enabled => TRUE); END; /
>如果需要准备报告,请在报告工具中计划报告,或使用Materialized View存储结果集.