如何在Oracle上使用不同的NLS_LANGUAGE处理包?

时间:2016-05-18 14:08:03

标签: oracle oracle11g

我有一个包会抛出多个这样的错误:

  IF EXIST > 0 THEN
    STATUS:= -1;
    pMSJ_ERROR:= 'ErrorXX: Fecha de transacción no puede ser mayor';

但是当DBA在另一个环境中运行此包时,包保存如下:

  IF EXIST > 0 THEN
    STATUS:= -1;
    pMSJ_ERROR:= 'ErrorXX: Fecha de transacci¿n no puede ser mayor';

所以我认为问题是因为数据库有不同的“nls_language”:

select value from v$system_parameter where name = 'nls_language';
DB1 Dev: LATIN AMERICAN SPANISH
DB2 Test: AMERICAN

我如何处理不同的nls_languages?

如果DB2中的dba使用:

alter session set nls_language = 'AMERICAN';

诀窍?

这两个数据库都是Oracle 11g

两个DB中的字符集都相同:

SELECT value FROM NLS_DATABASE_PARAMETERS WHERE parameter = 'NLS_CHARACTERSET';
 -- value = WE8MSWIN1252

2 个答案:

答案 0 :(得分:0)

这很可能取决于每个数据库使用的字符集,而不是语言。并且无法更改数据库的字符集。

但是,实际上问题可能只出现在DBA的显示屏上,而不是数据库本身。 DBA需要具有正确的字符集才能显示西班牙语字母。不幸的是,这不能在已经进行的会议期间设置; NLS_LANG只能更改区域和语言,而不能更改字符集。如何做到这一点取决于许多方面,包括操作系统(对于Windows,无论他/她是使用SQL * Plus还是其他类似DOS的客户端,还是Toad或SQL Developer或其他GUI)。详情如下:

http://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html

本文档还介绍了如何查找当前会话的(客户端)字符集。如文件中所述,这是非平凡的。

答案 1 :(得分:0)

参数NLS_LANGUAGE与字符集无关,它定义了Oracle(错误)消息的语言。

尝试以下,然后你会看到它。

alter session set NLS_LANGUAGE = 'SPANISH';
select 1/0 from dual;

alter session set NLS_LANGUAGE = 'AMERICAN';
select 1/0 from dual;

关于您的问题,您有两种解决方案。

  1. 检查终端使用的代码页,并相应地设置NLS_LANG值。

    示例:

    C:\>chcp
    Active code page: 850    
    C:\>set NLS_LANG=.US8PC437    
    C:\>sqlplus ...
    

    如果您的DBA使用Unix / Liunx,chcp等效项为locale charmapecho $LANG

  2. 根据您的NLS_LANG值更改当前代码页。 在Windows上,这是例如:

    C:\>set NLS_LANG
    NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
    C:\>chcp 1252
    Active code page: 1252
    C:\>sqlplus ...
    
  3. 你可以在Unix / Linux上做类似的事情。

    另请参阅this anser以获取更多信息。