ITPub博客

首页 > 数据库 > Oracle > NLS_LANGUAGE配置导致应用查询不到数据

NLS_LANGUAGE配置导致应用查询不到数据

原创 Oracle 作者:q499311546 时间:2020-09-21 20:30:38 0 删除 编辑
一、故障现象反馈

开发人员反馈系统查询不显示数据,但是使用PL/SQL developer调用相同的SQL可以查到数据。


二、问题排查
1.咨询开发人员是否执行相关事务未提交,确认未有相关事务执行。

2.使用SQLPlus在数据库后台查询反馈的SQL,同样无法查询到数据。SQL调用的是一个视图,在用SQLPlus查询,该视图返回0条数据,但是PL/SQL Developer返回6万多条数据。

SQL> SELECT COUNT(*) FROM APP_ADJ_HEADERS_V;
  COUNT(*)
----------
         0

3.查看视图的创建语句,发现有如下内容:

where
aa.LANGUAGE = USERENV('LANG')
bb.LANGUAGE = USERENV('LANG')


三、问题分析
根据视图的创建语句过滤条件可知,如果aa.LANGUAGE = USERENV('LANG')和bb.LANGUAGE = USERENV('LANG')不满足,则不返回数据。
而USERENV('LANG')的取值是根据当前会话的NLS_LANGUAGE返回的。
当NLS_LANGUAGE为AMERICAN时,值为US。
当NLS_LANGUAGE为SIMPLIFIED CHINESE时,值为ZHS。
SQL> alter session set nls_language="AMERICAN";
Session altered.
SQL> select userenv('lang') from dual;
USERENV('LANG')
----------------------------------------------------
US
SQL> alter session set nls_language="SIMPLIFIED CHINESE";
会话已更改。
SQL> select userenv('lang') from dual;
USERENV('LANG')
----------------------------------------------------
ZHS


四、参考学习

由NLS_LANGUAGE指定的这种语言用于messages, day and month names, symbols for AD, BC, a.m., and p.m以及默认的排序机制。 此参数还确定参数NLS_DATE_LANGUAGE和NLS_SORT的默认值。

NLS_LANGUAGE参数的值用于初始化此参数的会话值,该值是SQL查询处理引用的实际值。 如果客户端使用Oracle JDBC驱动程序或客户端基于OCI并且定义了NLS_LANG客户端设置(环境变量),则此初始值将被NLS_LANG覆盖。 因此,通常会忽略初始化参数值。

NLS_LANG=NLS_LANGUAGE+NLS_TERRITORY+NLS_CHARACTERSETNLS

作用优先级:SQL FUNCTION>alter session>环境变量或注册表>参数文件>数据库默认参数

相关视图:nls_database_parameters、nls_instance_parameters、nls_session_parameters


五、解决办法
修改应用端的NLS_LANG的配置与SQL保持一致
export NLS_LANG="SIMPLIFIED CHINESE_AMERICA.AL32UTF8"
#注意永久保存要写入环境变量中
SQL> SELECT COUNT(*) FROM APPS_ADJ_HEADERS_V;
  COUNT(*)
----------
         0
SQL> alter session set nls_language='SIMPLIFIED CHINESE';
会话已更改。
SQL>  SELECT COUNT(*) FROM APPS_ADJ_HEADERS_V;
  COUNT(*)
----------
     63579


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31355629/viewspace-2723018/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-06-03

  • 博文量
    23
  • 访问量
    21141