2011-11-02 149 views
2

我們創建了「登錄後」觸發器來更改會話以設置兩個NLS設置-NLS_SORT和NLS_COMP。需要將NLS_SORT設置爲BINARY_CI,並且需要將NLS_COMP設置爲LINGUISTIC。在建立連接以驗證值之後,通過查詢V $ NLS_PARAMETERS視圖,我發現NLS_COMP參數得到更新,但NLS_SORT沒有。OCI JDBC驅動程序和NLS設置

研究更後,我意識到,在建立連接

 ALTER SESSION SET NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA' 

後由於NLS_SORT派生自NLS_LANGUAGE,NLS_SORT參數值重置其值BINARY,而不是BINARY_CI的OCI JDBC驅動程序執行下面的查詢。 NLS_LANGUAGE設置取自Windows註冊表。

  1. oci jdbc驅動程序是否執行這些查詢以將客戶端上的NLS設置與數據庫服務器上的設置同步?

  2. 可以配置jdbc oci驅動程序以避免執行alter session set NLS_LANGUAGE查詢嗎?

我之所以問的第二個問題是,它沒有任何意義的應用服務器(如GlassFish中,Tomcat的,JBoss的)機(其上安裝OCI客戶端)設置覆蓋數據庫服務器設置。

回答

2

在引入用於設置這些值的登錄的觸發器後,我一直在使用完全相同的問題進行摔跤。

  1. 「的NLS_LANGUAGE和NLS_TERRITORY設置的目的是讓數據庫知道的語言環境信息。這些是從NLS_LANG的客戶機上設置(但也可以改變)的。這些設置允許數據庫發送數據以預期的格式和語言回饋給客戶。「 - 取自here
  2. 不,它不能配置爲避免執行,儘管它可能是未來的功能。實際上,似乎唯一的解決方案是讓您的應用程序在登錄後始終更改這些參數。

如果您使用瘦連接器而不是OCI驅動程序並且您設置了登錄觸發器,這些值將在登錄後正確設置。這裏的問題是OCI驅動程序只有在執行登錄觸發器後纔會根據NLS_LANG設置這些值。

+1

是的。有一個oracle提升請求,用於解決OCI驅動程序的問題。修復之後,語言和領土設置將在連接時傳遞給服務器,而不是在getConnection()調用之後傳遞它們,因爲它現在完成了。此修復程序將在版本12中提供。因此,現在唯一的解決方案是執行alter session查詢。 –

+0

@AndyDufresne請提供提及的*增強請求以解決您提到的OCI驅動程序*的問題。 –

+0

@Piotr Dobrogost - 您可以跟蹤計劃在12.1之前修復的id - 39670004。我現在不知道目前的狀態。 –

0

首頁/數據庫/ Oracle數據庫聯機文檔12C第1版(12.1)/應用開發/數據庫JDBC開發人員指南19 Globalization Support

從Oracle數據庫10g開始,NLS_LANG變量不再是 JDBC全球化機制的一部分。 JDBC驅動程序不檢查NLS環境。所以,設置它沒有效果。你觀察到

ALTER SESSION聲明可能來自下面的語句從全球環境從Oracle9i數據庫全球化支持指南第9 Java編程Globalization Support for JDBC Drivers部分(第2版(9.2))

在數據庫連接時,JDBC類庫將服務器 NLS_LANGUAGE和NLS_TERRITORY參數設置爲對應於運行JDBC驅動程序的Java VM的語言環境 。此操作僅在JDBC OCI和JDBC瘦驅動程序上執行 ,並確保 服務器和Java客戶端使用相同的語言進行通信。