【问题标题】:How can I get Time Zone Region from SQLPLUS?如何从 SQLPLUS 获取时区区域?
【发布时间】:2014-05-31 23:58:12
【问题描述】:

我正在使用 Oracle Developer 和 Oracle 11g(Oracle Database 11g 企业版版本 11.2.0.3.0 - 生产)

select SESSIONTIMEZONE from DUAL;

SQLPLUS/system_config_tbl_load.sql 中的结果:-4:00
SQL Developer 中的结果:America/New_York

在 SQL Developer 和 SQLPLUS 中给出不同的结果。
我想在 SQLPLUS 中查看该区域。

此外,我必须为多个位置执行此操作,并且无法使用“ALTER SESSION SET time_zone = 'America/New_York'”更改时区

【问题讨论】:

    标签: oracle oracle11g sqlplus


    【解决方案1】:

    我假设 SQL Developer 在您打开新连接时隐含 ALTER SESSION SET time_zone=...

    我看到了几种解决方案:

    • 在客户端主机上定义环境变量TZ
    • 创建数据库触发器并相应地设置时区
    • 更改数据库的时区 - 除非任何用户设置他的个人时区,否则可以正常工作

    数据库触发器:

    CREATE OR REPLACE TRIGGER LOG_T_LOGON 
       AFTER LOGON ON DATABASE
    DECLARE
    
    BEGIN
       IF ora_login_user IS NULL THEN 
          RETURN;
       END IF;
       IF ora_login_user IN (...) THEN -- Prevent to be executed for EACH user
          execute immediate 'ALTER SESSION SET time_zone = ''America/New_York''';
       END IF;
    END;
    

    结束;

    【讨论】:

    • 很抱歉,但这对我不起作用。由于这需要在多个位置运行,我不能为每个位置编写不同的函数。
    【解决方案2】:

    您可以在您的应用程序或此触发器中编写一个函数,如下所示:

    IF SESSIONTIMEZONE = '-4:00' THEN
       execute immediate 'ALTER SESSION SET time_zone = ''America/New_York''';
    ELSIF SESSIONTIMEZONE = '-5:00' THEN
       execute immediate ...
    END IF;
    

    【讨论】:

    • 这也不起作用,因为有多个区域与偏移量相关联(即 -4:00、-5:00)。也可以使用以下语句:SELECT distinct tzname, tz_offset(tzname) FROM V$TIMEZONE_NAMES order by tzname;
    • 那就越来越难了,你想将时区设置为(例如)'America/New_York',但你不想/可以在客户端位置设置它。在德语中,我们这样说:“洗我的外套,但不要弄湿我。” - 这是矛盾的。
    • 如果 Oracle 没有直接的方法,我最终可能会编写一个 Java 存储过程来从操作系统获取这些数据。附带说明 - 可能是“干洗”适用于外套。
    猜你喜欢
    • 2012-02-08
    • 2019-04-04
    • 1970-01-01
    • 2011-06-16
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多