2014-02-19 5 views
0

Я пытаюсь проверить соединение sql с помощью команды sqlplus в perl. Для этого я использовал следующий код.Выполнение команды sqlplus в perl

print "Befores\n"; 
$rc=system("sqlplus system/system @sqlfile.sql"); 
print "After $rc\n"; 
sleep(10); 

Значение возврата в rc равно 0 на этот раз. Но когда я даю неправильные учетные данные. Файл sqlfile.sql содержит единственную команду sql 'EXIT'.

$rc=system("sqlplus systemabc/system @sqlfile.sql"); 

Это также заканчивается кодом возврата 0. Но ручное выполнение учетных данных неверно. Помогите мне в решении этой проблемы ...

Заранее спасибо. :)

+0

Согласно http://perldoc.perl.org/functions/system.html, $? может предоставить вам информацию, которую вы ищете. –

+2

Является ли '@ sqlfile' фактическим массивом Perl, который вы пытаетесь интерполировать, или это ошибка, которую вы сделали? Вы должны использовать 'use strict; использовать предупреждения, 'ловить ошибки, подобные этому. Кроме того, 'system' не возвращает результат команды, он возвращает статус выхода. Если вы хотите вывод, используйте обратные ссылки или 'qx()'. – TLP

+0

@TLP: Согласно http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch3.htm#sthref798, OP использует правильный синтаксис, чтобы sqlplus выполнял команды sql в файле sqlfile файла. SQL. –

ответ

0

Да дорогой Friens ,,, Это теперь работает нормально.

Я просто добавил '\' перед @ sqlfile.sql, то есть я избежал символа '@', и я упомянул имя базы данных после моего пароля. Теперь я получаю идеальный результат. :)

Изменение как ниже:

$rc=system("sqlplus -L system/[email protected] \@sqlfile.sql"); 

Здесь формат я использовал: SQLPLUS -L Uname/пароль @ DBName \ @SqlFileContainingMySQLQuries

И -L Указывает, не reprompt для имени пользователя или пароля, если первоначальное соединение не выполняется. Для получения дополнительной информации goto About SQLPLUS

Я также пробовал, не избегая символа '@' перед sqlfile.sql, но изменение также должно применяться для перевернутых комов, я использовал Single inverted comas вместо двойных перевернутых комов, как указано ниже, как указано @ Рене Nyffenegger:

$rc=system('sqlplus -L system/[email protected] @sqlfile.sql'); 

Здесь формат я использовал: Sqlplus Uname/пароль @ DbName @SqlFileContainingMySQLQuries

Это также работает отлично.

-3

Почему вы это делаете? DBI существует, чтобы обеспечить здравый и безопасный способ использования баз данных и разумно получать от них выходные/возвращаемые/ошибки.

+1

Возможно, этот сценарий долгое время используется, и никто не знает, кто является оригинальным разработчиком, и он не поддаётся контролю и т. Д. В таком случае я мог бы представить, что это действительная причина для попыток того, чего хочет OP. –

+0

@ RenéNyffenegger Из описания нет никаких предположений, что OP не является оригинальным разработчиком. Независимо от этого, DBI обеспечивает гораздо более чистый способ взаимодействия с базами данных. –

-2

Проблема заключается линия

$rc=system("sqlplus system/system @sqlfile.sql"); 

У вас есть строка в двойных кавычках ("..."). Такие строки пытаются использовать epxand variables (начиная с @, $ и %). Поскольку в строке есть @sqlfile, perl предполагает, что это массив (который, конечно же, нет).

Remedy:

$rc=system('sqlplus system/system @sqlfile.sql'); 
-1

Да ...:) Я тоже попробовал это, спасибо за ответ @ user252025

я делал:

$rc=system("sqlplus -L user/user \@sql_file.sql"); 

Da код РТРС был неправилен для меня Теперь я в изменен

$rc=system("sqlplus -L user/[email protected] \@sql_file.sql"); 

Его рабочего fine .. Еще раз спасибо ...

Смежные вопросы