我有一个包会抛出多个这样的错误:
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
答案 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;
关于您的问题,您有两种解决方案。
检查终端使用的代码页,并相应地设置NLS_LANG
值。
示例:
C:\>chcp
Active code page: 850
C:\>set NLS_LANG=.US8PC437
C:\>sqlplus ...
如果您的DBA使用Unix / Liunx,chcp
等效项为locale charmap
或echo $LANG
根据您的NLS_LANG
值更改当前代码页。
在Windows上,这是例如:
C:\>set NLS_LANG
NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
C:\>chcp 1252
Active code page: 1252
C:\>sqlplus ...
你可以在Unix / Linux上做类似的事情。
另请参阅this anser以获取更多信息。