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