从Perl连接到Oracle

时间:2011-06-28 02:37:25

标签: perl oracle connect dbi nls

我正在尝试使用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?

3 个答案:

答案 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)

我在遇到同样的问题,最后可以解决。

在我的案例中,经过大量的调查和阅读后发现,问题的根源在于混合版本。服务器是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')列出已定义的服务名称。

瞧!我希望这可以帮助你!