我正在做很多插入查询,我认为最好为它编写子程序。像insertRow($table, @stuff_to_insert)
这样的东西。但是,当涉及@stuff_to_insert
时,如何使子程序动态化,这可以是1-5个参数中的任何内容?
答案 0 :(得分:4)
最佳解决方案可能是使用DBIx::Class等ORM系统。它们使处理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});
}
这将是一种速度和稳健性的好处。
你可以把它全部包装在一个sub中,但是ORM可能提供了一个更好的解决方案。
答案 1 :(得分:1)
类似的东西:
sub insertRow
{
my $table = shift;
my $placeholders = join(',', map { "?"; } @_);
$dbh->do("INSERT INTO $table VALUES ($placeholders)", undef, @_);
}
已编辑:您需要添加undef
作为参数。
Leon Timmermans建议不要使用原型
答案 2 :(得分:0)
只需传递对参数数组的引用。然后在insertRow中,迭代该数组以获取参数...
答案 3 :(得分:0)
传递部分参数很容易:
sub foo {
my $table = shift;
my @stuff_to_insert = @_;
# Do stuff here
}
无论您传入一个参数,还是五个或五十个,它们都会进入@stuff_to_insert
。
至于运行实际查询,请采用Leon的建议并使用预准备语句。 (ORM可以很方便,但是,IMO,它们被高估了,并且在简单的情况下严重过度杀伤。)