我不知道“可变参数”是否真的是正确的词,但我说的是可以采用值列表的东西,比如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 字符串的道路。
有没有更好的办法?