3

我正在做很多插入查询,我认为最好为它编写一个子例程。类似的东西insertRow($table, @stuff_to_insert)@stuff_to_insert但是,当涉及到1-5 个参数时,如何使子例程动态化?

4

4 回答 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 回答