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");
Другие вопросы по тегам