2

我有的

我有一个检查与 oracle 数据库的连接的 Perl 脚本。这是我的代码

#!/usr/bin/perl
use DBI;
my $ORACLE_SID =  $ENV{'ORACLE_SID'};
$\="\n";
print "exported variable=$ORACLE_SID";
print "Connecting to DB..";
my $dbh = DBI->connect('dbi:Oracle:host=oracle;sid=$ORACLE_SID;port=1521', 'books_admin/MyPassword', '',{ RaiseError => 1, AutoCommit => 0 })or die print ("could not connect! $DBI::errstr \n");

我已经导出了 ORACLE_SIDexport ORACLE_SID=ORCLCDB 这段代码的输出是

    exported variable=ORCLCDB
    Connecting to DB..
    DBI connect('host=oracle;sid=$ORACLE_SID;port=1521','books_admin/MyPassword',...) failed: ORA-12505: TNS:listener does not currently know of SID given in connect descriptor (DBD ERROR: OCIServerAttach) at perl.pl line 8. 

似乎 ORACLE_SID 被 Perl 拾取,但未在 sid=$ORACLE_SID 中使用。为什么打印功能可以使用 $ORACLE_SID 而 sid=$ORACLE_SID 无法获取值

4

1 回答 1

4
print "exported variable=$ORACLE_SID";

这是有效的,因为您有一个双引号字符串。变量在双引号字符串中展开。

my $dbh = DBI->connect('dbi:Oracle:host=oracle;sid=$ORACLE_SID;port=1521', 'books_admin/MyPassword', '',{ RaiseError => 1, AutoCommit => 0 })or die print ("could not connect! $DBI::errstr \n");

在这里,你$ORACLE_SID在一个单引号字符串中。并且变量不会在单引号字符串中展开。你需要改变:

'dbi:Oracle:host=oracle;sid=$ORACLE_SID;port=1521'

至:

"dbi:Oracle:host=oracle;sid=$ORACLE_SID;port=1521"
于 2019-10-31T10:47:37.120 回答