我正在做很多插入查询,我认为最好为它编写一个子例程。类似的东西insertRow($table, @stuff_to_insert)
。@stuff_to_insert
但是,当涉及到1-5 个参数时,如何使子例程动态化?
Jinxen
问问题
638 次
4 回答
4
最好的解决方案可能是使用 ORM 系统,例如DBIx::Class。它们使处理 SQL 变得更加容易。
如果您选择继续使用原始 DBI,我建议您使用如下准备好的语句:
my $query = sprintf 'INSERT INTO %s VALUES(%s)', dbh->quote_identifier($table), join ',', ('?') x $columns;
my $sth = $dbh->prepare($query);
for my $row (@rows) {
$sth->execute(@{$row});
}
这将是速度和鲁棒性的好处。
您可以将其全部封装在一个子程序中,但 ORM 无论如何可能提供更好的解决方案。
于 2009-02-16T10:51:31.287 回答
1
就像是:
sub insertRow
{
my $table = shift;
my $placeholders = join(',', map { "?"; } @_);
$dbh->do("INSERT INTO $table VALUES ($placeholders)", undef, @_);
}
编辑:您需要添加undef
为参数。Leon Timmermans 建议不要使用原型
于 2009-02-16T10:36:01.637 回答
0
只需传递对参数数组的引用。然后在 insertRow 中,遍历该数组以获取参数...
于 2009-02-16T10:49:22.650 回答
0
它的参数传递部分很容易:
sub foo {
my $table = shift;
my @stuff_to_insert = @_;
# Do stuff here
}
不管你传入一个参数,还是五个,或者五十个参数,它们都会进入@stuff_to_insert
.
至于运行实际查询,请采纳 Leon 的建议并使用准备好的语句。(ORM 可能很方便,但是,IMO,它们被高估了,在简单的情况下严重过度杀伤。)
于 2009-02-16T11:13:14.387 回答