Oracle

在登錄觸發器中設置 NLS 參數在 oracle 11g 中不起作用

  • June 12, 2013

我們有一個觸發器設置,因此當特定使用者登錄時,他們的 NLS 會話參數會被修改。這曾經在 Oracle 10g 上工作。我們剛剛遷移到 Oracle 11g RAC,會話參數不再持續存在。為了解釋,我粘貼了一個會話,顯示 NLS_DATE_FORMAT 未正確使用。

這是我們正在使用的觸發器:

create or replace
TRIGGER schmea.nls_tr
AFTER logon ON DATABASE
BEGIN
  execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'' NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF'' NLS_TERRITORY = ''AMERICA''';
END;

上面的格式不是預設的,所以它們似乎在登錄時發生了變化。

SQL> select * from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT' or parameter = 'NLS_DATE_FORMAT'; 

PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
YYYY-MM-DD HH24:MI:SS

NLS_TIMESTAMP_FORMAT
YYYY-MM-DD HH24:MI:SS.FF

SQL> select count(*) from TABLE where start_date > '2012-06-10 00:00:00';
select count(*) from TABLE where start_date > '2012-06-10 00:00:00'
*
ERROR at line 1:
ORA-12801: error signaled in parallel query server P024, instance
[domain.com]:[instance] (1)
ORA-01861: literal does not match format string

SQL> alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 

Session altered.

SQL> select count(*) from TABLE where start_date > '2012-06-10 00:00:00';

 COUNT(*)
----------
     4901

SQL> select * from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT' or parameter = 'NLS_DATE_FORMAT'; 

PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
YYYY-MM-DD HH24:MI:SS

NLS_TIMESTAMP_FORMAT
YYYY-MM-DD HH24:MI:SS.FF

請幫忙。我已經把頭髮扯掉了 13 小時 7 分 4 秒。有任何想法嗎?

謝謝你。

更改 SET 的順序似乎有所不同,因為它現在正在工作。

create or replace
TRIGGER schema.django_nls_tr
AFTER logon ON DATABASE
BEGIN
execute immediate 'ALTER SESSION SET NLS_TERRITORY = ''AMERICA'' NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'' NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF''';
END;

我不太喜歡這個解決方案,因為我仍然不明白為什麼更改順序很重要。也許 TERRITORY 設置不正確,但它已經是預設設置,所以我們現在不必太擔心。

此外,django 確實做了一個TO_TIMESTAMP. 它預計大多數日期欄位是 TIMESTAMP(6),但我們讓它指向具有 DATE 類型欄位的遺留數據庫。NLS 在標準部署中應該不會太重要。

對“My Oracle Support”(MOS) 的搜尋表明,這是至少在 11.1.0.6 和 11.1.0.7 版本中報告的錯誤。其中一個錯誤報告 #6747927 似乎表明它已在 11.2 中修復,儘管根據您的標籤之一判斷,

$$ oracle-11g-r2 $$,情況可能並非如此。我建議你用 MOS 開一張票。

引用自:https://dba.stackexchange.com/questions/19025