DBI连接失败:ERROR OCINlsEnvironmentVariableGet(OCI_NLS_CHARSET_ID)

时间:2016-05-10 09:08:41

标签: oracle perl remote-access dbi

我试图在我的perl应用程序中连接到远程Oracle数据库。运行应用程序时,会出现以下错误:

DBI connect('//XXX.XXX.XXX.XXX:1522/TEST','user','password') 
failed: ERROR OCINlsEnvironmentVariableGet(OCI_NLS_CHARSET_ID)
Check NLS settings etc. at App.pm line 28.

我的App.pm

package App;

use strict;
use warnings;

use DBI;

my $instance = undef;
BEGIN {
    $ENV{OCI_NLS_CHARSET_ID} = "AMERICAN_AMERICA.CL8MSWIN1251";
    $ENV{ORACLE_HOME} = "path";
}
sub get_instance {
    $instance = bless {}, shift unless $instance;
    return $instance;
}

sub new {
    my ($caller) = @_;
    my $class = ref($caller) || $caller;
    return get_instance($class);
}

sub connect {
    my $self = shift;
    $self->{dbh} = DBI->connect('dbi:Oracle://XXX.XXX.XXX.XXX:1522/TEST', 'user', 'password');
}

sub DESTROY {
    my $self = shift;
    $self->{dbh}->disconnect if $self->{dbh};
}

1;

NLS_PARAMETERS:

PARAMETER                                                        VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE                                                     AMERICAN
NLS_TERRITORY                                                    AMERICA
NLS_CURRENCY                                                     $
NLS_ISO_CURRENCY                                                 AMERICA
NLS_NUMERIC_CHARACTERS                                           .,
NLS_CALENDAR                                                     GREGORIAN
NLS_DATE_FORMAT                                                  DD-MON-RR
NLS_DATE_LANGUAGE                                                AMERICAN
NLS_CHARACTERSET                                                 CL8MSWIN1251
NLS_SORT                                                         BINARY
NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                                                $
NLS_NCHAR_CHARACTERSET                                           AL16UTF16
NLS_COMP                                                         BINARY
NLS_LENGTH_SEMANTICS                                             BYTE
NLS_NCHAR_CONV_EXCP                                              FALSE

19 rows selected

我在Windows 7上使用ActiveStat perl。 Windows 2003上的服务器ORACLE 11.2.0.2.0 x64。 DBI 1.634。 DBI-Oracle 1.74。

在服务器上,应用程序正在成功运行。

2 个答案:

答案 0 :(得分:0)

您使用的是Instant Client Oracle库吗? AFAIK Instant Client仅支持WE8ISO8859P1和AL32UTF8。尝试使用完整(密集)的Oracle客户端。

答案 1 :(得分:0)

  1. http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html为您的平台下载相应的Instant Client软件包。

  2. 将软件包解压缩到一个目录中(例如" instantclient_11_2")。

  3. 将环境的库加载路径(例如Linux上的LD_LIBRARY_PATH或Windows上的PATH)设置为步骤2中创建的目录。

  4. 没有:

    $ENV{OCI_NLS_CHARSET_ID} = "AMERICAN_AMERICA.CL8MSWIN1251";
    $ENV{ORACLE_HOME} = "path";