首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PERL: DBI连接(‘’,'system',.)失败:使用dbi个人包时出错OCIEnvNlsCreate

PERL: DBI连接(‘’,'system',.)失败:使用dbi个人包时出错OCIEnvNlsCreate
EN

Stack Overflow用户
提问于 2014-11-27 14:10:15
回答 2查看 1.6K关注 0票数 0

我正在尝试创建一个带有uses::Oracle的应用程序类。我对ORACLE_HOME和ORACLE_SID环境变量有一个问题。

当我在BEGIN附件中设置这些变量时,它可以很好地工作,参见示例:

代码语言:javascript
复制
#!/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;命令之前,必须设置这些变量。

是否有一种方法来对开始部分进行参数化,或者是否有其他方法可以这样做?

谢谢你的帮助。拉加兹

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-28 15:10:27

这里使用的环境变量有两个非常不同的用途。

如果要连接到不同的Oracle实例,请转储/重写ORACLE_SID环境变量,并使用DBD::Oracle->connect中的连接字符串传递SID。文档中的一行显示了这个示例:

代码语言:javascript
复制
$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作业设置。

一个例外可能是在测试环境中,但在这种情况下,您可能有充分的准备来更改环境变量来测试每个候选客户端。

票数 0
EN

Stack Overflow用户

发布于 2014-11-27 14:53:14

%ENV哈希是一种访问shell环境变量的方法。因此,您可以通过在程序之外设置环境变量来解决问题,然后再调用它。

代码语言:javascript
复制
$ export ORACLE_HOME=/app/oracle/product/11.2.0/db_1
$ export ORACLE_SID=DB01
$ ./name_of_your_program

不要忘记删除整个BEGIN块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27172631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档