2014-02-19 107 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"); 

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