Могу ли я установить «Любой» для параметра связывания в Perl (Oracle SQL) - PullRequest
1 голос
/ 03 августа 2011

В модуле Perl у меня есть такой код:

 ...
 my $param = 123;
 my $sql = "select id, name from obj where id = ?";
 $sth = $DBH->prepare($sql) || die $DBH->errstr;
 $sth->execute($param) || die $DBH->errstr;
 ...

whern param имеет значение все хорошо, но в этом модуле есть условия, когда вам нужно выбрать все строки из таблицы (в моем коде $param = undef)

Кто-нибудь знает, как это сделать без изменения запроса?

thx!

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Это невозможно сделать без изменения запроса, поскольку вы не можете сравнить что-либо с NULL, используя '=', а undef равен NULL; вам нужно использовать 'is null' или 'not null'. Ищите «NULL-значения» в DBI , и это объяснит.

Редакция после комментариев:

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

my $sql = q/select something from table where ? is null or column = ?/;
$s->prepare($sql);
# here $param is undef for all rows and !undef for specific rows
$s->execute($param, $param);
0 голосов
/ 03 августа 2011

Я обычно предпочитаю решение, предоставляемое bohica, но Oracle может сделать несколько странных оптимизаций, и немного поиграть с запросом может для некоторых запросов получить гораздо лучшую производительность или намного хуже. (Всегда тестируйте любое решение)

select * from cust where cust_no = nvl(?, cust_no);

Это будет соответствовать cust_no =? когда переменная связывания установлена ​​и cust_no = cust_no, когда переменная связывания равна нулю. Oracle обычно оптимизирует cust_no = cust_no и просто возвращает все строки.

...