当前时间系统_时间特殊寄存器

当前时间系统_时间特殊寄存器指定一个TIMESTAMP(12)值,用于默认的SYSTEM_TIME周期规范,以引用系统周期时间表。

当查询引用系统周期临时表且当前临时系统时间特殊寄存器的值不为空时,隐含以下周期说明:

FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME

特殊寄存器的初始值取决于上下文,具体如下:

  • 如果特殊寄存器位于触发器中,则初始值从调用应用程序继承。
  • 如果特殊寄存器位于使用 INHERIT SPECIAL REGISTERS 选项定义的用户自定义函数或程序中,则初始值将从调用应用程序中继承。
  • 如果特殊寄存器位于使用默认特殊寄存器选项定义的用户自定义函数或程序中,则初始值为空值。
  • 在其他情况下,特殊寄存器的初始值为空值。

您可以使用 SET CURRENT TEMPORAL SYSTEM_TIME 语句更改特殊寄存器的值。 如果在例程中更改值,则新值不会返回调用应用程序。

当CURRENT TEMPORAL SYSTEM_TIME特殊寄存器的值不为空且SYSTIMESENSITIVE绑定选项设置为YES时,您不能在 select语句中明确指定FOR SYSTEM_TIME。

示例

查询引用系统周期时间表的示例
假设以下条件:
  • STT是一个系统周期临时表,而POLICY_ID是STT的一个列。
  • SYSTIMESENSITIVE绑定选项的价值为“是”。
  • 当前时间系统_时间的值不为空。

假设您发出以下查询:

SELECT * FROM STT
WHERE POLICY_ID = 123;

Db2 为查询生成一个隐式的 SYSTEM_TIME 周期规范,如下所示:

SELECT * FROM STT
FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME
WHERE POLICY_ID = 123;
使用当前时间系统_时间的程序示例
假设程序 MYPROC 定义如下:
CREATE PROCEDURE MYPROC(OUT VAR1 VARCHAR(40), OUT VAR2 VARCHAR(40))
BEGIN
 SELECT CURRENT TEMPORAL SYSTEM_TIME INTO VAR1
 FROM SYSIBM.SYSDUMMY1;

 SET CURRENT TEMPORAL SYSTEM_TIME = TIMESTAMP('2011-01-01') + 5 DAYS ;

 SELECT CURRENT TEMPORAL SYSTEM_TIME INTO VAR2
 FROM SYSIBM.SYSDUMMY1;
END!

假设应用程序定义了字符串变量 VAR1、 VAR2 和 VAR3 ,并包含以下SQL语句:

SET CURRENT TEMPORAL SYSTEM_TIME = TIMESTAMP('2008-01-01') + 5 DAYS ;

CALL MYPROC(VAR1, VAR2);

SELECT CURRENT TEMPORAL SYSTEM_TIME INTO VAR3
FROM SYSIBM.SYSDUMMY1

在执行SQL语句后,变量具有以下值:

  • VAR1 具有值 ' ',这是当前时间系统_时间值,在调用过程之前的 CALL 语句中设置。 2008-01-06-00.00.00.000000000000
  • VAR2 具有值 ' ',这是在当前时间系统_时间值中设置的当前时间系统_时间值。 2011-01-06-00.00.00.000000000000
  • VAR3 具有值 ' ',这是在当前时间系统_时间值中设置的,在调用语句之前。 2008-01-06-00.00.00.000000000000 程序中寄存器值的改变对调用应用程序没有影响。
查询引用系统周期时间表的示例
假设IN_TRAY是一个系统周期临时表,其中包含收件箱中笔记的用户和主题行。 以下查询根据当前临时系统时间(CURRENT TEMPORAL SYSTEM_TIME)特殊寄存器指定的日期,根据IN_TRAY中邮件的状态返回用户ID和主题行。
SELECT SOURCE, SUBJECT
FROM IN_TRAY

如果特殊寄存器被设置为非空值,则前面的语句等效于下面的语句:

SELECT SOURCE, SUBJECT
FROM IN_TRAY
FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME