2011-08-03 14 views
1

在Perl模塊,我有這樣的代碼:我可以設置「任意」在perl的綁定參數(Oracle的SQL)

... 
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!

回答

0

我通常喜歡通過bohica提供的解決方案,但甲骨文可以做一些奇怪的優化,並打了一下,用查詢可以爲某些查詢獲得更好的性能,或者更糟。 (始終以任何解決方案爲基準)

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

這將匹配cust_no =?當綁定變量設置時,cust_no = cust_no,當綁定變量爲空時。 Oracle通常優化cust_no = cust_no並僅返回所有行。

+0

好點,我提供了一個通用的解決方案,而不是Oracle特定的解決方案。 – bohica

+0

偉大的解決方案!Thx! – Akvel

2

不改變查詢就無法完成,因爲您無法使用'='與NULL進行比較,並且undef爲NULL;你需要使用'is null'或'not null'。在DBI中搜索「NULL值」,它會解釋。評論後

修訂:

如果我正確現在明白了問題,你可能要選擇基於一個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

是的,空值很酷,但我的大問題 - 如何設置一些像「id LIKE'%'」參數querry中的任何數據類型列 – Akvel

+0

我不明白你的意思。你怎麼能用參數來做到這一點,或者不用改變SQL。也許你想做什麼的具體例子會有所幫助。 – bohica

+0

是的。你對我很好。現在我這樣做:if($ param!= undef){$ where =「where id = $ param」}; ($ sql); $ sth-> execute()。但是這不是正確的方法,因爲這種方式會得到oracle的緩存,而且我不會不知道該怎麼做: - ( – Akvel

相關問題