在Oracle SQL中使用OR语句

时间:2011-10-05 20:40:32

标签: sql oracle

我在perl中的SQL SELECT中遇到OR语句的问题。

    ######################### Open File and Split The Data Into An Array ####################################
$input_data_file = '/var/www/html/JG/TG/tower_gather.txt';
open (DAT, $input_data_file)
          or die ("Could not open file!");

@raw_data = <DAT>;

close(DAT);
#########################################################################################################

$dbh_source2 = DBI->connect("dbi:Oracle:host=<ip-address>;port=<port-number>;sid=<sid>",'username','password');
$SEL = "SELECT DISTINCT SITE_NAME, SITEID, PE_DOWNLINK_PORT FROM CBHME.SERVICE_TOPOLOGY_VIEW WHERE LOWER(PE_FQDN) = ? OR PE_OSPF_LOOPBACK_IP = ?";


$fqdn = $q->param('PE_FQDN');

$sth = $dbh_source2->prepare($SEL);
print '<table border=1>';
print '<tr>';
print '<th>SUR FQDN</th>';
print '<th>Tower Name</th>';
print '<th>Site ID</th>';
print '<th>SUR Link</th>';

print '</tr>';
foreach my $data_line (@raw_data) {
        chomp $data_line;

        $sth->execute($data_line);

        while (my @row = $sth->fetchrow_array ) {
              #Print data into cells#
              print "<tr>";
              print "<td>$data_line</td>";
              foreach (@row) {
                print "<td>$_</td>";
              }
              print "</tr>";
              #print "<$data_line>\t @row\n";

        }

}

print "</table>";
END {     
            $dbh_source2->disconnect if defined($dbh_source2);
}  

The error:
[jgearh200@srv01-netops cgi-bin]$ ./tower_gather_script.cgi 
DBD::Oracle::st execute failed: called with 1 bind variables when 2 are needed [for Statement "SELECT DISTINCT SITE_NAME, SITEID, PE_DOWNLINK_PORT FROM CBHME.SERVICE_TOPOLOGY_VIEW WHERE LOWER(PE_FQDN) = ? OR PE_OSPF_LOOPBACK_IP = ?" with ParamValues: :p1=undef, :p2=undef] at ./tower_gather_script.cgi line 33.
DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first) [for Statement "SELECT DISTINCT SITE_NAME, SITEID, PE_DOWNLINK_PORT FROM CBHME.SERVICE_TOPOLOGY_VIEW WHERE LOWER(PE_FQDN) = ? OR PE_OSPF_LOOPBACK_IP = ?" with ParamValues: :p1=undef, :p2=undef] at ./tower_gather_script.cgi line 35.
<table border=1><tr><th>SUR FQDN</th><th>Tower Name</th><th>Site ID</th><th>SUR Link</th></tr></table>[jgearh200@srv01-netops cgi-bin]$ 

所以我希望它能够做到:

我有一个文本区域,用户在其中逐行输入FQDN或IP地址,然后进入Oracle数据库并获取某些信息。

SELECT语句试图根据用户输入的内容(IP或FQDN)获取该信息。

谢谢

2 个答案:

答案 0 :(得分:1)

DBD::Oracle::st execute failed: called with 1 bind variables when 2 are needed...

嗯,你去了:你需要将两个变量绑定到select语句(即$SEL中有问号的部分),而不只是一个。

答案 1 :(得分:0)

您是否遇到将变量绑定到查询的问题?

$query = "SELECT something FROM table WHERE firstname = ? AND lastname = ?";

$bindh = $dbh->prepare( $query )
   or die "Unable to prepare $query" . $dbh->errstr;

foreach $line ( @Array )
{
   ( $f1, $f2 ) = split( /\|/, "$line" );

   $bindh->execute( $f1, $f2 ) 
     or die "Unable to execute '$query'.  " . $bindh->errstr;

   @results = $bindh->fetchrow_array;
}