Sud*_*rma 2 sql oracle plsql oracle11g
CREATE TABLE DIALOGUE_TABLE(EXPIRE_TIME TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)
以下代码片段位于存储过程中:
PO_EXPIRETIME :- OUT PARAM of procedure a varchar2
SELECT TO_CHAR(SYS_EXTRACT_UTC(EXPIRE_TIME))
INTO PO_EXPIRETIME
FROM DIALOGUE_TABLE;
Run Code Online (Sandbox Code Playgroud)
当我从服务器运行Stored Proc时EXEC,打印PO_EXPIRETIME时间戳与UTC格式正确.
但是,当我从OCCI和客户端调用存储过程时,收到的时间戳不相同,但这是表中未实现UTC格式化的实际时间戳.
也许我想念的东西,但我不知道的是什么?我需要在客户端做些什么吗?
如果该列声明为TIMESTAMP而不是,例如TIMESTAMP WITH TIME ZONE或TIMESTAMP WITH LOCAL TIME ZONE,则表中存储的时间戳将不具有时区组件.因此,SYS_EXTRACT_UTC将使用会话时区将时间戳转换为UTC,该会话时区由客户端控制,并且在不同的客户端计算机上可能不同.我怀疑如果你跑了
SELECT SessionTimeZone
FROM dual;
Run Code Online (Sandbox Code Playgroud)
从您的OCCI应用程序和SQL*Plus会话中,您将得到不同的结果,这会导致返回的字符串不同.
如果您希望返回的字符串独立于客户端计算机,我倾向于建议将时区存储在数据库列中.是否正在更改模式定义以使用TIMESTAMP WITH TIME ZONE选项?除此之外,您可以确保每台客户端计算机都配置了相同的时区和/或运行显式的ALTER SESSION,即
ALTER SESSION
SET time_zone = '-05:00';
Run Code Online (Sandbox Code Playgroud)
在存储过程中,以确保始终从特定时区完成转换.