gpt4 book ai didi

sql - 如何在 Perl 的 DBI 中为可变 SQL 函数使用占位符?

转载 作者:行者123 更新时间:2023-12-03 18:18:31 25 4
gpt4 key购买 nike

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

有没有更好的办法?

最佳答案

深思熟虑。

DBIx::Simple使用双问号占位符为此类事物提供语法:

$db->query( 'SELECT * FROM mytbl WHERE foo IN ( ?? )', @args );

另外, SQL::Abstract功能强大,但我发现有时抽象不会产生最佳 SQL。

关于sql - 如何在 Perl 的 DBI 中为可变 SQL 函数使用占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com