我正在尝试使用DBD :: 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',...)失败:ERROR OCIEnvNlsCreate
我的Oracle体系结构可能具有多个ORACLE_HOME,因此这就是为什么我想将其作为变量参数。
在创建DBIAgent对象之前,我试图进行设置,但是出现相同的错误。我认为必须在使用DBI之前设置这些变量。命令被调用。
有没有一种方法可以设置BEGIN节的参数,或者有另一种方法可以做到这一点?
谢谢你的帮助。拉加兹
您在这里使用了2个环境变量有两个非常不同的目的。
如果要连接到其他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 Client软件的位置,并告诉XS组件在DBD::Oracle
哪里可以找到链接所需的库。我真的想不出一个很好的理由,想在生产环境中对此变量进行设置。全新安装的事实DBD::Oracle
需要针对那些相同的客户端库编译这些XS组件,这很容易使您的尝试变得复杂。奇怪的是您要使用计算机上的最新版本。ORACLE_HOME
几乎总是由登录脚本,/ etc / init.d脚本或特定cron
作业设置的。
一个例外可能是在测试环境中,但是在那种情况下,您可能会准备好改变环境变量来测试每个候选客户端。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句