如何在perl脚本中传递sql文件中的perl变量

时间:2011-09-27 11:38:49

标签: sql perl

这里我在perl中有3个变量,我在sql查询行中的一个db.sql文件中传递这些变量,然后在同一个perl文件中执行该db.sql文件,但是它没有获取这些变量。

$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');

请帮助我如何传递变量,以便我可以一次运行更多的一个插入查询。

3 个答案:

答案 0 :(得分: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文件来自哪里。如果你能澄清完整的工作流程,那将会很有帮助。

答案 1 :(得分: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文件或以某种方式解析它...

答案 2 :(得分: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");
}