我试图在我的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。
在服务器上,应用程序正在成功运行。
答案 0 :(得分:0)
您使用的是Instant Client Oracle库吗? AFAIK Instant Client仅支持WE8ISO8859P1和AL32UTF8。尝试使用完整(密集)的Oracle客户端。
答案 1 :(得分:0)
从http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html为您的平台下载相应的Instant Client软件包。
将软件包解压缩到一个目录中(例如" instantclient_11_2")。
将环境的库加载路径(例如Linux上的LD_LIBRARY_PATH或Windows上的PATH)设置为步骤2中创建的目录。
没有:
$ENV{OCI_NLS_CHARSET_ID} = "AMERICAN_AMERICA.CL8MSWIN1251";
$ENV{ORACLE_HOME} = "path";