DBI上的错误ORA-12154>使用Solaris 10中的Oracle Instant Client连接到Oracle数据库

时间:2013-04-19 23:33:24

标签: perl oracle11g dbi solaris-10 tnsnames

我已经把头发拉出这个问题两天了:

我正在尝试使用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

My 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文件的情况下连接到代码,但是当我尝试使用它时,它会中断。

有什么建议吗?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

这是一个旧帖子,但是问题通常是连接问题。要解决此问题,您需要确保在端口1521上允许从客户端到服务器端的连接。您可以通过在客户端“ telnet 1521”上发出此命令来执行测试,您应该会收到一个空白屏幕,指示连接成功进入数据库。否则,路径之间将存在ACL或防火墙阻止端口1521。