我正在尝试设置一个DBMS_SCHEDULER作业,以便在每年1月1日凌晨1点在Oracle 11g上运行.如何设置其属性以确保它不会在错误的时间执行,因为时区差异或夏令时.
我花了很多时间浏览Oracle文档,但我还没有达到确定性水平.
顺便说一句,以下是我发现并考虑与该主题相关的规则:
工作属性
start_date此属性指定计划启动此作业的第一个日期.如果start_date和repeat_interval保留为null,则作业将在计划启动后立即运行.
对于重复使用日历表达式指定重复间隔的作业,start_date用作参考日期.第一次安排作业运行是当前日期或之后的日历表达式的第一个匹配.
调度程序无法保证作业将在准确的时间执行,因为系统可能会过载,因此资源不可用.
repeat_interval此属性指定作业重复的频率.您可以使用日历或PL / SQL表达式指定重复间隔.
评估指定的表达式以确定下次运行作业的时间.如果未指定repeat_interval,则作业将仅在指定的开始日期运行一次.有关详细信息,请参阅“日历语法”.
Calendaring语法中的规则
>日历语法不允许您指定时区.
而是调度程序从start_date检索时区
论点.如果工作必须遵循夏令时调整,您必须
确保为时区指定区域名称
开始日期.例如,将start_date时区指定为
纽约的“美国/东方”将确保夏令时
自动应用调整.如果是时区
start_date设置为绝对偏移量,例如’-5:00′,
不遵循夏令时调整和您的工作执行
将在一年半的时间里休息.
>当start_date为NULL时,Scheduler将确定重复间隔的时区,如下所示:
>它将检查会话时区是否为区域名称.会话时区可以通过以下任一方式设置:
发出ALTER SESSION语句,例如:SQL>改变会话
SET time_zone =’亚洲/上海’;设置ORA_SDTZ环境
变量.
>如果会话时区是绝对偏移而不是区域名称,则调度程序将使用DEFAULT_TIMEZONE Scheduler属性的值.有关更多信息,请参阅SET_SCHEDULER_ATTRIBUTE过程.
>如果DEFAULT_TIMEZONE属性为NULL,则在启用作业或窗口时,调度程序将使用systimestamp的时区.