我正在尝试使用Perl连接到Oracle。
我正在尝试从安装了Perl的Windows XP计算机进行连接。我还下载了Oracle SQL Developer和Oracle Instant Client。我可以使用Oracle SQL Developer使用TNS连接类型连接到Oracle DB。
我使用以下Perl。
use DBI;
$db=DBI->connect( "dbi:Oracle", "username", "password" ) or die "Can't connect $DBI::errstr\n";
我收到以下错误消息。
DBI connect('','username',...) failed: ERROR OCINlsEnvironmentVariableGet(OCI_NLS_CHARSET_ID) Check NLS settings etc. at oracle2.pl line3
Cant connect to database ERROR OCINlsEnvironmentVariableGet(OCI_NLS_CHARSET_ID) Check NLS settings etc.
我是否需要对Oracle Instant Client执行任何操作,因为它没有安装程序。是否还需要在Perl中配置其他东西?
感谢您提供的任何帮助。
*编辑*
我是否需要在Perl的开头设置任何变量以链接到SQL Developer或Instant Client?
答案 0 :(得分:1)
我使用了一种不同的方法将Perl连接到Oracle DB。我使用SQLPlus而不是DBI。这是Oracle的命令行实用程序,可以从Perl调用。下面是我的代码示例。 test.sql文件可以包含一个或多个查询,必须以exit结束。
my $connect_string = 'username/password@server'; # connection to the DB
my $file = 'test.sql'; # location of SQL file. The file must end with "exit"
my $sqlcmd = "sqlplus -S $connect_string \@$file"; # sqlcommand
system $sqlcmd; # executes command
答案 1 :(得分:0)
使用该错误消息和您的代码片段,我首先要检查明确是否有助于在$db=DBI->connect(..
的第一个参数中声明Servername(如果需要,请google for一些例子)。
如果这没有帮助,我会检查环境变量OCI_NLS_CHARSET_ID
的值。
答案 2 :(得分:0)
我在cygwin遇到同样的问题,最后可以解决。
在我的案例中,经过大量的调查和阅读后发现,问题的根源在于混合版本。服务器是11.2,同时我使用12.1 Instant Client软件包为Oracle.dll
构建DBD::Oracle
。所以我下载了11.2版本(来自Oracle),这条错误消息刚刚消失!
我已阅读Trooble Shooting手册,但似乎需要3个软件包:Basic,SDK和sqlplus(构建过程使用后者来确定服务器版本)。
在构建之前,必须设置一些bash变量:
export ORACLE_HOME=/cygdrive/c/install/instantclient_11_2
PATH+=:"$ORACLE_HOME"
export TNS_ADMIN="$HOME"
后者需要找到Oracle.dll引用的oci.dll。这被添加到PATH,因为Windows查找PATH以查找DLL而不是LD_LIBRARY_PATH。文件tnsnames.ora可以位于$TNS_ADMIN
目录,/var/opt/oracle
或/etc
(或其他某些地方)。可以通过DBI->data_sources('Oracle')
列出已定义的服务名称。
瞧!我希望这可以帮助你!