Я не знаю, является ли слово "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 )" );
что не , поэтому ужасно, но рассмотрим функцию, подобную той, что я написал сегодня, которая должна принимать произвольный SQL с предложением IN
и списком значений
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, если мне это не нужно.
Есть ли лучший способ?