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

来源:这里教程网 时间:2026-03-03 16:12:57 作者:
一、故障现象反馈

开发人员反馈系统查询不显示数据,但是使用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

相关推荐