2014-02-19 119 views
0

我想通过perl中的sqlplus命令检查sql连接。 我已经使用下面的代码来做到这一点。在perl中执行sqlplus命令

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结束。但是,手动执行Credentials是错误的。 帮我解决这个问题...

在此先感谢。 :)

+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执行sqlfile文件中的sql命令。 SQL。 –

回答

0

是的,亲爱friens ,,, 它现在工作的罚款。

我在@ sqlfile.sql之前添加了'\',即我逃过了'@'符号,并在密码后提到了数据库名称。现在我正在获得完美的输出。 :)

的变化是波纹管:

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

在这里,我使用的格式是: SQLPLUS -L UNAME /密码@数据库名\ @SqlFileContainingMySQLQuries

和-L指定不如果初始连接不成功,请重新提供用户名或密码。欲了解更多信息转到About SQLPLUS

我也试过没有逃脱sqlfile.sql前的“@”符号,但变化也应适用于倒昏迷,我作为由@提到的单倒昏迷,而不是二级倒立昏迷的波纹管勒内Nyffenegger:

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

在这里,我使用的格式是: SQLPLUS UNAME /密码@数据库名@SqlFileContainingMySQLQuries

这也能正常工作。

-3

你为什么这样做? DBI存在以提供一个理智和安全的方式使用数据库和明智地从他们输出/返回/错误。

+1

也许,这个脚本已经使用了很长时间,并且没有人知道谁是原始开发者,并且它是不可维护的。在这种情况下,我可以想象这是尝试OP所需的一个合理原因。 –

+0

@RenéNyffenegger从描述中可以看出,OP并不是最初的开发者。无论如何,DBI提供了一种更简洁的与数据库交互的方式。 –

-2

的问题是线

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

你必须用双引号("...")引用的字符串。这样的字符串尝试epxand变量(从@$%开始)。由于字符串中有@sqlfile,因此perl假定这是一个数组(当然不是)。

补救措施:

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

是啊...:)我也试过了,感谢您的回答@ user252025

我做:

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

达RTRN代码是错误的,我 现在我已经改为

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

其工作很好.. 再次感谢...