2011-11-02 151 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客户端使用相同的语言进行通信。