1

我已经为这个问题拉了两天的头发:

我正在尝试获取一个 perl 脚本来与 Oracle 数据库交互。我有一个新服务器,我想在上面部署我的应用程序。该脚本以前有效。

这是我到目前为止所做的:

将我的 tnsnames.ora 文件放在 Instantclient/network/admin 中:

ls -la network/admin/
total 8
drwxrwxrwx   2 m staff        512 Apr 19 09:54 .
drwxrwxrwx   3 m staff        512 Mar 28 15:56 ..
-rwxrwxrwx   1 m staff        777 Apr 19 09:54 tnsnames.ora

我的 Perl 脚本如下所示:

  12 use CGI;
   13 use DBI;
   14 use Data::Dumper;
   15 use strict;
   16 
   28 $ENV{ORACLE_HOME} = "/xxx/instantclient/";
   29 
   32 $ENV{'LD_LIBRARY_PATH'} = "xxx/instantclient/lib";
   33 
   35 use DBD::Oracle;
   36 
   37 print "DBI::VERSION: $DBI::VERSION\n";
   38 print "$DBD::Oracle::VERSION\n";
   66 my $dbh = DBI->connect("dbi:Oracle:host=computer;port=1521;sid=mydatabase", "user", "pass");
   67 my $sth = $dbh->prepare("SELECT sysdate FROM dual");
   68 my $rv = $sth->execute; 
   69 DBI::dump_results($sth) if $rv;
   70 $dbh->disconnect;
   71 
   72 print "$database $dbUser $dbPassword \n";
   73 
   74 my $dbh = DBI->connect( $database, $dbUser, $dbPassword ) or die("PROBLEM WITH LINE:\n$! , stopped");

此脚本产生以下输出:

DBI::VERSION: 1.609
DBD::Oracle version: 1.24
'19-APR-13'
1 rows
dbi:Oracle:mydatabase user pass 
DBI connect('mydatabase','user',...) failed: ORA-12154: TNS:could not resolve the connect identifier specified (DBD ERROR: OCIServerAttach) at ./code.pl line 74

我的 tnsnames.ora 文件包含以下条目:

mydatabase =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = computer )(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = service.computer.com)
    )
  )

这个 tnsnames.ora 文件是从一台正常工作的机器上复制的,所以我相信它可以工作。

奇怪的是,我可以在不使用 tnsnames.ora 文件的情况下连接到代码,但是当我尝试使用它时,它会中断。

有什么建议么?

4

2 回答 2

1

不确定它是否有帮助,但以下内容对我有用:

使用 tnsnames.ora(在 $ORACLE_HOME/network/admin 目录内)进行本地连接:

my $db = DBI->connect( "dbi:Oracle:mydatabase", "scott", "tiger" );

并且不使用 tnsnames.ora 进行连接:

my $db = DBI->connect("dbi:Oracle:host=$host;sid=$sid;port=1521",$user,$passwd)
    || die( $DBI::errstr . "\n" );

其中 $host, $sid 必须事先定义。

于 2016-10-11T08:18:43.250 回答
0

This is an old post, but the problem is generally a connectivity issue. To resolve this problem you need to ensure connectivity is allowed from the client side to server side on port 1521. You can perform a test by issuing this command on the client side "telnet 1521" You should receive a blank screen which indicates a successful connection into the database. Otherwise, there is an ACL or firewall blocking port 1521 between the path.

于 2019-10-04T14:16:08.260 回答