如何为具有不同数量值的DBI插入编写子例程?

时间:2009-02-16 10:28:07

标签: perl insert dbi

我正在做很多插入查询,我认为最好为它编写子程序。像insertRow($table, @stuff_to_insert)这样的东西。但是,当涉及@stuff_to_insert时,如何使子程序动态化,这可以是1-5个参数中的任何内容?

4 个答案:

答案 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,它们被高估了,并且在简单的情况下严重过度杀伤。)