我正在尝试创建一个带有uses::Oracle的应用程序类。我对ORACLE_HOME和ORACLE_SID环境变量有一个问题。
当我在BEGIN附件中设置这些变量时,它可以很好地工作,参见示例:
#!/usr/bin/perl
use strict;
use warnings;
use Switch;
use DBI;
# Debug
use Data::Dumper;
package DBIAgent;
BEGIN
{
$ENV{ORACLE_HOME}="/app/oracle/product/11.2.0/db_1";
$ENV{ORACLE_SID}="DB01";
}
sub new {
my $class = shift;
my $self = {
_username => shift,
_password => shift,
_database => shift,
_logger => shift
};
$self->{_oracleConnected} = 0;
bless $self, $class;
return $self;
}
sub TO_JSON {
return { %{ shift() } };
}
sub connect {
my ( $self ) = @_;
foreach (sort keys %ENV) {
$self->{_logger}->log ("INFORMATION - $_ = $ENV{$_}");
}
$self->{_logger}->log ("INFORMATION - Username " . $self->{_username});
$self->{_logger}->log ("INFORMATION - Password " . $self->{_password});
eval {
$self->{_oracleConnexion} = DBI->connect("dbi:Oracle:", $self->{_username}, $self->{_password}, {ora_verbose=>6}) or die ("ERROR - Unable to connect to database " . $self->{_database} . " - " . $! . " SQL ERROR: " . $DBI::errstr);
};
if ($@) {
$self->{_oracleConnected} = 0;
$self->{_logger}->log ($@);
} else {
$self->{_oracleConnected} = 1;
$self->{_logger}->log ("INFORMATION - Connected to database " . $self->{_database});
}
return $self->{_oracleConnected};
}
sub getSqlResult {
my ( $self, $sqlName, $sqlText ) = @_;
my $resultSet;
eval {
$resultSet = $self->{_oracleConnexion}->selectall_arrayref($sqlText) or die ("ERROR - Execution for sql " . $sqlName . " on database " . $self->{_database} . " failed - SQL ERROR: " . $DBI::errstr);
};
if ($@) {
$self->{_logger}->log ($@);
return "";
} else {
return $resultSet;
}
}
sub close {
my ( $self ) = @_;
$self->{_oracleConnexion}->disconnect();
$self->{_oracleConnected} = 0;
$self->{_logger}->log ("INFORMATION - Disconnected from database " . $self->{_connexionInfo}->{database});
}
# Getters / Setters
sub getConnected {
my( $self ) = @_;
return $self->{_oracleConnected};
}
1;删除BEGIN部分时,会得到以下错误: DBI connect('','system',.)失败:错误OCIEnvNlsCreate
我的ORACLE_HOME可能有多个ORACLE_HOME,所以我想把它作为一个可变参数。
我尝试在创建DBIAgent对象之前设置它,但是我得到了相同的错误。我承认,在调用使用DBI;命令之前,必须设置这些变量。
是否有一种方法来对开始部分进行参数化,或者是否有其他方法可以这样做?
谢谢你的帮助。拉加兹
发布于 2014-11-28 15:10:27
这里使用的环境变量有两个非常不同的用途。
如果要连接到不同的Oracle实例,请转储/重写ORACLE_SID环境变量,并使用DBD::Oracle->connect中的连接字符串传递SID。文档中的一行显示了这个示例:
$dbh = DBI->connect('dbi:Oracle:host=foobar;sid=DB;port=1521', 'scott/tiger', '');更多细节@ https://metacpan.org/pod/DBD::Oracle#connect
另一方面,ORACLE_HOME指向您的计算机上安装的Oracle软件的位置,并告诉DBD::Oracle的XS组件在哪里找到链接所需的库。我真的想不出为什么您想要在生产环境中设置这个变量。DBD::Oracle的新安装需要针对同一个客户端库编译这些XS组件,这一事实很容易使您的尝试复杂化。很可能你会想在机器上使用最新的版本。ORACLE_HOME几乎总是由登录脚本、/etc/init.d脚本或特定的cron作业设置。
一个例外可能是在测试环境中,但在这种情况下,您可能有充分的准备来更改环境变量来测试每个候选客户端。
发布于 2014-11-27 14:53:14
%ENV哈希是一种访问shell环境变量的方法。因此,您可以通过在程序之外设置环境变量来解决问题,然后再调用它。
$ export ORACLE_HOME=/app/oracle/product/11.2.0/db_1
$ export ORACLE_SID=DB01
$ ./name_of_your_program不要忘记删除整个BEGIN块。
https://stackoverflow.com/questions/27172631
复制相似问题