2013-04-19 4 views
0

Я потянув меня за волосы над этой проблемой в течение двух дней теперь:Ошибка ORA-12154 на DBI-> подключиться к базе данных Oracle с Oracle Instant Client в Solaris 10

Я пытаюсь получить Perl скрипт для взаимодействия с базой данных Oracle. У меня есть новый сервер, на котором я хочу развернуть свое приложение. Этот скрипт ранее работал.

Вот что я сделал до сих пор:

Размещенные мой файл tnsnames.ora в instantclient/сети/администратора:

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, но когда я пытаюсь его использовать, он ломается.

Любые предложения?

+0

У меня такая же проблема, и у меня нет ответа, но я хочу добавить дополнительные примечания. Сначала у меня такая же проблема, используя ldap.ora. Я _assuming_, тогда имена не будут корректно разрешаться. Заметки в Интернете говорят о том, что DBI должен использовать то же разрешение, что и SQL * Net. Также, похоже, есть некоторые признаки того, что 64-битный/32-битный оракул для несовместимости perl может вызвать это, но я, похоже, не добился успеха при переключении драйверов. – nick

+0

Кроме того, имя работает внутри жабы и ссылается на тот же каталог мгновенного клиента, который содержит ldap.ora и sqlnet.ora. – nick

ответ

0

Не уверен, если это поможет, но следующие работал для меня:

для подключения локально с помощью tnsnames.ora (в $ ORACLE_HOME/сети/Справочник администратора):

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 должны быть определены заранее.