【发布时间】:2009-10-29 23:49:45
【问题描述】:
我不知道“variadic”是否真的是正确的词,但我说的是可以采用值列表的东西,例如IN()。如果您长期使用 DBI,您可能尝试过这样做:
(注意:为简洁起见,所有示例都非常简化)
my $vals = join ', ', @numbers;
my $sth = $dbh->prepare( "SELECT * FROM mytbl WHERE foo IN( ? )" );
$sth->execute( $vals ); # doesn't work
DBI 占位符根本不支持这些恶作剧,据我所知,它是每个 ? 的单个值或什么都没有。
这导致我最终做了类似的事情:
my $sth = $dbh->prepare( "SELECT * FROM mytbl WHERE foo IN ( $vals )" );
这不是那么可怕,但考虑一个函数,就像我今天写的那样,它必须接受一些带有IN 子句和值列表的任意 SQL
sub example {
my $self = shift;
my ( $sql, @args ) = @_;
my $vals = join ', ', @args;
$sql =~ s/XXX/$vals/; <---- # AARRRGHGH
my $sth = $self->dbh->prepare( $sql );
...
}
这最终会被看起来像的东西调用
my $sql = "SELECT * FROM mytbl WHERE foo IN( XXX ) AND bar = 42 ORDER BY baz";
my $result = $self->example( $sql, @quux );
这真的冒犯了我的审美。以编程方式构建自定义 SQL 已经够痛苦了。如果不需要的话,我不想走上正则表达式我的 SQL 字符串的道路。
有没有更好的办法?
【问题讨论】: