Oracle
在登錄觸發器中設置 NLS 參數在 oracle 11g 中不起作用
我們有一個觸發器設置,因此當特定使用者登錄時,他們的 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 開一張票。