天天看點

nls_timestamp_format參數在11.2中的變化

nls_timestamp_format參數在11.2.0.2及以後版本通過pfile或spfile或都不能進行修改了,在會話級還是能進行修改,oracle提供若幹nls參數定制資料庫和客戶機以适應本地格式,例如有nls_language,nls_date_format,nls_calender等,可以通過查詢以下資料字典或v$視圖檢視。

nls_database_parameters:顯示資料庫目前nls參數取值,包括資料庫字元集取值

nls_session_parameters:顯示由nls_lang設定的參數,或經過alter session改變後的參數值(不包括由nls_lang設定的用戶端字元集)

nls_instance_paramete:顯示由參數檔案init.ora定義的參數

v$nls_parameters:顯示資料庫目前nls參數取值

使用下列方法可以修改nls參數

(1)更新props$

(2)修改執行個體啟動時使用的初始化參數檔案

(3)修改環境變量nls_lang

(4)使用alter session語句,在oracle會話中修改

(5)使用某些sql函數

nls作用優先級别:sql function > alter session >環境變量或系統資料庫>參數檔案>資料庫預設參數。如果會話級與執行個體級别和資料庫級别參數不一緻,就會以會話級的為準,因為會話級别的參數優先級高于執行個體級别和資料庫級别的參數。用戶端的環境變量或系統資料庫會對會話參數産生影響,比如nls_lang參數

nls_lang=language_territory.client character set

language:顯示oracle消息,校驗,日期命名

territory:指定預設日期、數字、貨币等格式

client character set:指定用戶端将使用的字元集

例如:nls_lang=american_america.us7ascii

american是語言,america是地區,us7ascii是用戶端字元集,那麼就會影響 nls_date_format,nls_timestamp_foramt等日期的格式。

下面通過操作來進行驗證。

在會話級進行修改

将nls_timestamp_format參數設定成yyyy-mm-dd hh24:mi:ssxff格式

檢視是否在會話級修改成功

從上面的查詢可以看到在會話級nls_timestamp_format參數設定成了yyyy-mm-dd hh24:mi:ssxff格式。

下面通過alter system語句與spfile參數檔案來在系統級别進行修改

重新啟動執行個體後,檢視nls_timestamp_format參數的值沒有被修改

通過pfile來檢查spfile檔案中nls_timestamp_format參數的設定可以發現,alter system對nls_timestamp_format的修改并沒有存儲到spfile檔案中。

手工向pfile參數檔案中增加nls_timestamp_format參數設定

使用增加nls_timestamp_format參數的pfile檔案來啟動資料庫,報錯不能啟動資料庫。

嘗試通過props$來進行修改

修改之後檢視資料庫級别nls_timestamp_format參數值已經修改成功

修改之後檢視執行個體級别nls_timestamp_format參數值已經修改成功

修改之後檢視會話級别nls_timestamp_format參數值沒有修改成功

檢視用戶端環境變量nls_lang= american_america.zhs16gbk,是以在會話級nls_timestamp_format的格式仍然為dd-mon-rr hh.mi.ssxff am

修改環境變量,這裡選擇去掉nls_lang

再次通過用戶端連接配接到資料庫檢視nls_timestamp_foramt參數

資料庫級别nls_timestamp_foramt參數為修改後的yyyy-mm-dd hh24:mi:ssxff

執行個體級别nls_timestamp_foramt參數為修改後的yyyy-mm-dd hh24:mi:ssxff

會話級别nls_timestamp_foramt參數為修改後的yyyy-mm-dd hh24:mi:ssxff,說明nls_lang環境變量沒有對會話級産生影響了。

用遠端客戶機(windows)用plsql連接配接需要設定環境變量nls_timestamp_foramt,将nls_timestamp_format設定成與props$中nls_timestamp_format參數相同的參數值,以確定會話級與執行個體級和資料庫級一緻,避免不一緻所産生的問題。在設定完環境變後,用plsql連接配接資料庫來進行檢查

總結:

nls_timestamp_format在數在11.2.0.2及以後版本不能通過pfile或spfile來在執行個體級别進行修改。要想在執行個體級修改nls_timestamp_format可以通過props$來進行修改,這是在資料庫級别進行修改,但由于不能在執行個體級别設定,那麼執行個體級會繼承資料庫級别的設定,是以隻要在資料庫級别設定了nls_timestamp_format,那麼執行個體級别的nls_timestamp_format也就等于設定了。

用戶端的環境變量(unix/linux)nls_lang會在會話級别影響nls_timestamp_format。

用戶端的環境變量(windows)nls_timestamp_format會在會話級别影響nls_timestamp_format。