最近項目除了一個問題,場景大概是這樣的,項目在國外開發,在項目開發過程中使用了大量的Oracle函數TO_DATE,但是開發人員沒有寫第二個參數。
所以項目在國外的服務器上可以正常運行,可是在國內的服務器上就不能正常運行了。
通過調查是因為,TO_DATE函數的第一個參數為YYYYMMDD,第二個參數為空時,默認使用session中NLS_DATE_FORMAT參數。
數據庫服務器采用的是英文版,所以默認NLS_DATE_FORMAT是RR-MM-DD,而在國外連接到Oracle數據庫服務器時,會使用客戶端的參數
覆蓋服務器端的參數。(這個是根據Oracle官方文檔得出的)
This initial value is overridden by a client-side value if the client uses the Oracle JDBC driver or if the client is OCI-based and the NLS_LANG client setting (environment variable) is defined. The initialization parameter value is, therefore, usually ignored.
但是官方文檔上沒有講怎麼做,所以查資料,在注冊表中的Software》》Oracle下以key開始的key下添加了String Value, NLS_DATE_FORMAT=YYYYMMDD。
通過實驗證實,這個修改對於SQLPLUS是有效的,可是對於SQLDeveloper是無效的。目前還沒有找到對SQLDeveloper有效的方法。
其次,對於JDBC也沒有找到設置參數的方式,如果大家有好的方法可以給我留言。
不過退而求其次,我找到了一個可以解決這個問題的方法,那就是創建觸發器。
我創建的觸發器如下:
CREATE OR REPLACE TRIGGER LOGINTRG
AFTER LOGON ON DATABASE
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''RR/MM/DD''';
END LOGINTRG;
注意要是日期格式不對,SQL不會執行。