这里我在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');
请帮助我如何传递变量,以便我可以一次运行更多的一个插入查询。
答案 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");
}