2011-09-27 45 views
0

這裏我有3個變量在perl和im傳遞這些變量在sql查詢行中的一個db.sql文件,然後在相同的perl文件中執行該db.sql文件,但它是沒有獲取這些變量。如何通過perl腳本中的sql文件中的perl變量

$patch_name="CS2.001_PROD_TEST_37987_spyy"; 
$svn_url="$/S/B"; 
$ftp_loc="/Releases/pkumar"; 
open(SQL, "$sqlfile") or die("Can't open file $sqlFile for reading"); 
while ($sqlStatement = <SQL>) 
{ 
    $sth = $dbh->prepare($sqlStatement) or die qq("Can't prepare $sqlStatement"); 

    $sth->execute() or die ("Can't execute $sqlStatement"); 
} 
close SQL; 
$dbh->disconnect; 

以下是db.sql文件查詢

insert into branch_build_info(patch_name,branch_name,ftp_path) 
values('$patch_name','$svn_url','$ftp_loc/$patch_name.tar.gz'); 

請幫助我,我怎麼能傳遞變量,這樣我可以運行更多的在當時是一個插入查詢。

+1

什麼錯誤信息或其他信息關於什麼不順心你有嗎è?請注意,您在'$ sqlfile'和'$ sqlFile'中使用了兩個不同的變量,'$/S/B''包含美元符元字符,它將被擴展爲'$ /',這是輸入記錄分隔符。 – TLP

+0

你不能準備'insert into branch_build_info(patch_name,branch_name,ftp_path)'這個語句,這是你一次只需要一行就可以做的事情 - 因爲你的'db.sql'文件有效。 – Axeman

回答

4

如果你能影響的sql文件,你可以使用佔位符

insert into ... values(?, ?, ?); 

,然後在執行提供參數:

my $ftp_path = "$ftp_loc/$patch_name.tar.gz"; 
$sth->execute($patch_name, $svn_url, $ftp_path) or die ... 

這樣,你只需要一次準備語句並且可以根據需要隨時執行。但我不確定,那個sql文件來自哪裏。如果您能澄清完整的工作流程,這將會很有幫助。

0

這裏存在一些問題 - 看起來您需要讀取所有SQL文件以進行查詢,但是您一次只讀一行,嘗試將每行作爲單獨的查詢運行。 <SQL>只是從文件中取下一行。

假設有在文件中只是一個查詢,像下面這樣可以幫助:

open(my $SQL_FH, '<', $sqlfile) 
    or die "Can't open file '$sqlFile' for reading: $!"; 

my @sql_statement = <$SQL_FH>; 

close $SQL_FH; 

my $sth = $dbh->prepare(join(' ',@sql_statement)) 
    or die "Can't prepare @sql_statement: $!"; 

$sth->execute(); 

但是,你仍然需要擴大您的SQL文件中的變量。如果因爲已經建議你不能用佔位符代替它們,那麼你就需要要麼eval文件或以某種方式解析它...

0

可以使用String::Interpolate模塊插值包括已經生成的字符串,就像你拉出一個文件的字符串:

while ($sqlStatement = <SQL>) 
{ 
    my $interpolated = new String::Interpolate { patch_name => \$patch_name, svn_url => \$svn_url, ftp_loc => \$ftp_loc }; 
    $interpolated->($sqlStatement); 

    $sth = $dbh->prepare($interpolated) or die qq("Can't prepare $interpolated"); 

    $sth->execute() or die ("Can't execute $interpolated"); 
} 

另外,還可以手動對字符串進行替換,以進行插值:

while ($sqlStatement = <SQL>) 
{ 
    $sqlStatement =~ s/\$patch_name/$patch_name/g; 
    $sqlStatement =~ s/\$svn_url/$svn_url/g; 
    $sqlStatement =~ s/\$ftp_loc/$ftp_loc/g; 

    $sth = $dbh->prepare($sqlStatement) or die qq("Can't prepare $sqlStatement"); 

    $sth->execute() or die ("Can't execute $sqlStatement"); 
}