我可以在perl中为bind param设置“Any”(Oracle的SQL)

时间:2011-08-03 05:14:10

标签: sql perl oracle dbi

在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 个答案:

答案 0 :(得分:2)

在不更改查询的情况下无法完成,因为无法使用'='将NULL与NULL进行比较,并且undef为NULL;你需要使用'is null'或'is not null'。在DBI中搜索“NULL值”,它将解释。

评论后修改:

如果我现在正确理解了问题,您可能希望根据Perl标量是否为undef来选择所有行或特定行。解决方案是:

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);

答案 1 :(得分:0)

我通常更喜欢bohica提供的解决方案,但是Oracle可以做一些奇怪的优化,并且对查询进行一些调查可以使某些查询获得更好的性能,或者更糟糕。 (始终对任何解决方案进行基准测试)

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

这将匹配cust_no =?设置绑定变量时,绑定变量为null时为cust_no = cust_no。 Oracle通常会优化cust_no = cust_no out,只返回所有行。