dtharby has asked for the wisdom of the Perl Monks concerning the following question:

Hi All,
I am trying to use an if...else statement to setup a SELECT command and exeute..
$cth->prepare("SELECT COUNT(*) From Table1 Where....."); $cth->execute($Server1,$App1,$Inst1,); if (@rows == "0") { $sth->prepare("SELECT 1"); $sth->execute($Svr1,$ap1,$in); } else { $sth->prepare("SELECT 2") $sth->execute($svr1,$ap); }

Sorry for the coding but my original code is on another system !!!
Is this the right way to do this ?? I cannot seem to find any reference to this using the search.
Thanks
Danny

Replies are listed 'Best First'.
Re: Using If statement to set DBI prepare
by Fang (Pilgrim) on Jul 21, 2005 at 10:25 UTC

    First, prepare() is not a statement handle method, it's a database handle one. Apart from that, your way seems appropriate for what you want to do. In the TIMTOWTDI philosophy, you could set up the SQL statement and placeholders in the conditional and execute at the end. Something along the lines of

    my ($sql, @placeholders); if (@rows == 0) { $sql = qq{SELECT 1}; @placeholders = ($svr1, $ap1, $in); } else { $sql = qq{SELECT 2}; @placeholders = ($svr1, $ap); } my $sth = $dbh->prepare($sql); $sth->execute(@placeholders);

    Looks more wordy, but that's how I usually like to do it.

    Update: I had a comment for @rows == "0", but apparently perl is smart enough to DWIM and guess the correct context, never producing any warning or some such, whatever the case may be (@rows eq "0", @rows eq 0 and @rows == 0 all work).

      Yeah, I know about the statement handle & db handle. as I said my original code is on another system and I can't remember all of it.
      thanks for the idea of placeholders, it makes it look much neater. I will give it a try.
      Thanks Danny
      I am having a problem now where the @rows eq "0" dows not appear to be working. @rows has a value and I have confirmed that it is correct. But the statement to see if the value is eq to 0 seems to be bypassed.
      Here is the code :-
      my $cth = $dbh->prepare('SELECT COUNT(*) FROM SuppressList WHERE A +ctive = ? AND ServerName = ? AND Application = ? and Instance = ?') o +r die "Couldn't Prepare statement: " . $dbh->errstr; $cth->execute($Active,$Server_Name,$App,$Inst); @rows = $cth->fetchrow_array(); cawto "Rows: @rows"; my ($sql, @placeholders); if (@rows ge "1") { $sql = qq{SELECT * FROM SuppressList WHERE Active = ? AND Serv +erName = ? AND Application = ? AND Instance = ?}; @placeholders = ($Active,$Server_Name,$App,$Inst); cawto "ServerName/App/Inst Execute Complete"; } else { $sql = qq{SELECT * FROM SuppressList WHERE Active = ? AND Serv +erName = ? AND Application = ?}; @placeholders = ($Active,$Server_Name,$App); cawto "ServerName/App Execute Complete"; } my $sth = $dbh->prepare($sql); $sth->execute(@placeholders);

      I am lost... it appears to work then it actually doesn't. Any tips ?
      Cheers
      Danny

      Update: Sorry forgot to add that I changed to ge from eq to see if that worked.. It doesn't. Also running this on Win32 platform.

        Start by using the correct operator: @rows == 1. The eq operator worked when comparing to 0, but it could very well be an exception.