Perl DBI - привязка списка
Как связать переменную с набором SQL для запроса IN в Perl DBI?
Пример:
my @nature = ('TYPE1','TYPE2'); # This is normally populated from elsewhere
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ?"
) || die("Failed to prepare query: $DBI::errstr");
# Using the array here only takes the first entry in this example, using a array ref gives no result
# bind_param and named bind variables gives similar results
$qh->execute(@nature) || die("Failed to execute query: $DBI::errstr");
print $qh->fetchrow_array();
Результат для кода, как указано выше, приводит только к числу TYPE1
в то время как требуемый результат является суммой счета для TYPE1
а также TYPE2
, Замена записи связывания ссылкой на @nature
(\@nature
), приводит к 0 результатам.
Основной сценарий использования этого - позволить пользователю проверить несколько вариантов, используя что-то вроде группы флажков, и вернуть все результаты. Обходной путь - это создать строку для вставки в запрос - он работает, однако ему требуется много фильтрации, чтобы избежать проблем с внедрением SQL, и это уродливо...
В моем случае база данных - Oracle, в идеале я хочу универсальное решение, которое не зависит от базы данных.
1 ответ
Там должно быть столько ?
заполнители как есть элементы в @nature
т.е. in (?,?,..)
my @nature = ('TYPE1','TYPE2');
my $pholders = join ",", ("?") x @nature;
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ($pholders)"
) or die("Failed to prepare query: $DBI::errstr");