2011-12-11 44 views
1

我有以下代碼:如何在Perl中在運行時綁定DBI參數?

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字段?如果它提供了,我想它動態綁定。

+1

您提供的代碼有問題嗎? – TLP

+0

如果沒有提供name和$ sth-> execute($ name)運行。 – smith

+1

my $ name = shift; #|| undef不需要...你不應該引用單獨的變量,$ dbh-> prepare($ sql) – tadmc

回答

6

DBI documentation on cpan

一個常見的問題是有一個代碼段處理可能是一個值 定義或在運行時是undef(非空或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 :()); 
+2

三元運算符也可以在列表上下文中工作,所以你可以說'my($ sql,@args)= defined $ name? ('select ...',$ name):('select ...');'和'$ sth-> execute(@args);'將條件邏輯全部保存在一個地方。 –

4

你或許應該有兩個不同的潛艇,但你可以使用

sub run_query { 
    my $sql = @_ 
     ? "select * from table where name = ?" 
     : "select * from table"; 
    my $sth = $dbh->prepare($sql); 
    $sth->execute(@_); 
} 
+0

@smith,請注意,「未提供」與「未定義」不同。我回答了實際問題(未提供:'@_?$ name:()'),TLP和bvr回答了後者(未定義:'defined($ name)?$ name:()')。也就是說,在這個特定的情況下,這個區別肯定是無關緊要的。 – ikegami

1

可以有條件地忽略參數如果$name沒有定義:

$sth->execute(defined $name ? $name :()); 
相關問題