2016-08-22 47 views
0

數據庫是Oracle 11g2 Express。我執行alter system set NLS_DATE_FORMAT = "DD/MM/RRRR" SCOPE=SPFILE;,然後我做了一個查詢:select hire_date from employees;但顯示的格式仍然是DD/MM/RR!那麼如何永久更改nls_date_format執行alter system後日期格式不會更改

+1

你用什麼工具顯示你的數據? – Codo

+0

你認爲'SCOPE = SPFILE' [手段](http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2014.htm#SQLRF53147)?你真的想在系統級別改變它,而這通常是被忽略的,而不是在會話/客戶端級別嗎? –

回答

0

您可以在不同層次

以實例/服務器的初始化參數設置NLS參數。

SQL>alter system set V$NLS_PARAMETER = 'XXX' scope = both; 

作爲客戶端上的環境變量。

% setenv NLS_SORT FRENCH 

作爲ALTER SESSION參數。

SQL> ALTER SESSION SET V$NLS_PARAMETER = = 'XXX' 

任何設置都將覆蓋較高級別上的設置。因此,將其設置爲服務器端並不能保證所有連接的客戶端都使用該設置。

如果您想確保爲每個連接的客戶端設置它,請使用登錄觸發器。即使此時用戶可以明確地覆蓋「默認」設置

LOGON TRIGGER在會話級別設置這些參數。

CREATE OR REPLACE TRIGGER sys.schema_nls_session_settings AFTER LOGON ON BOB.SCHEMA 
BEGIN 
execute immediate 'alter session set NLS_LANGUAGE=''ENGLISH'''; 
execute immediate 'alter session set NLS_TERRITORY=''UNITED KINGDOM'''; 
execute immediate 'alter session set NLS_CURRENCY=''£'''; 
execute immediate 'alter session set NLS_ISO_CURRENCY=''UNITED KINGDOM'''; 
END; 
/
+3

像SQL Developer這樣的工具在其偏好中也有一個日期格式。它僅用於在SQL工作表中顯示結果。但它忽略了任何系統和會話設置。 – Codo

0

好的,我重新啓動數據庫,然後設置格式!

1

SCOPE = SPFILE,僅在靜態參數文件中進行更改,但不在當前實例中進行更改。當您重新啓動數據庫時,實例將使用來自SPFILE的新值構建。

SCOPE = MEMORY,在當前實例中進行更改,但不在靜態參數文件中。當您重新啓動數據庫時,實例將使用舊值構建。所以你失去了改變。

SCOPE = BOTH,在當前實例和靜態參數文件中進行更改。

無論何時重新啓動數據庫,都會使用靜態參數文件中的值構建實例。在你的情況下,當你重新啓動時,實例是使用更改後的值構建的。所以它重新啓動數據庫後正在工作。如果您使用了SCOTE的BOTH值,那麼您不必重新啓動數據庫。

希望這會有所幫助。

+0

如果他們使用了'SCOPE = BOTH'這個值,他們會得到ORA-02096;您不能在正在運行的實例中修改此參數。 –