Как связать параметры DBI во время выполнения в Perl? - PullRequest
1 голос
/ 11 декабря 2011

У меня есть следующий код:

sub run_query { 
    my $name = shift || undef;
    my $sql  = (defined $name ) ? "select * from table where name = ?" :
                                  "select * from table";
    my $sth  = $dbh->prepare("$sql");
    $sth->execute($name);
}

Вышеупомянутая подпрограмма должна работать следующим образом: если предоставлено $name, то выполните первый запрос, иначе получите все данные из таблицы. Как я могу связать поле name? Я бы хотел, чтобы он был связан динамически, если он указан.

Ответы [ 3 ]

6 голосов
/ 11 декабря 2011

Из документации DBI на cpan :

Общая проблема заключается в том, чтобы фрагмент кода обрабатывал значение, которое может быть определено или не определено (не NULL или NULL).) во время выполнения.Простой метод состоит в том, чтобы подготовить соответствующее утверждение по мере необходимости и заменить заполнитель для случаев, отличных от NULL:

  $sql_clause = defined $age ? "age = ?" : "age IS NULL";
  $sth = $dbh->prepare(qq{
    SELECT fullname FROM people WHERE $sql_clause
  });
  $sth->execute(defined $age ? $age : ());

Это не совсем относится к вашему вопросу, который я предполагаю означает, что выполнение завершится неудачно, если вы добавите аргумент, который не ожидается.Итак, последняя строка здесь будет применяться:

  $sth->execute(defined $name ? $name : ());
4 голосов
/ 11 декабря 2011

Вероятно, у вас должно быть два разных сабвуфера, но вы можете использовать

sub run_query { 
    my $sql = @_
       ? "select * from table where name = ?"
       : "select * from table";
    my $sth  = $dbh->prepare($sql);
    $sth->execute(@_);
}
1 голос
/ 11 декабря 2011

Вы можете условно опустить параметры, если $name не определено:

$sth->execute(defined $name ? $name : ());
...