简体   繁体   中英

select count(*) not working with perl DBI

The goal of my code is to return a count of the number of rows in a table based on one specific parameter.

Here is code that works:

######### SQL Commands
### Connect to the SQL Database
my $dbh = DBI->connect($data_source, $user, $pass)
    or die "Can't connect to $data_source: $DBI::errstr";

### Prepare the SQL statement and execute
my $sth1 = $dbh->selectrow_array("select count(*) from TableInfo where Type = '2'")
or die "Can't connect to $data_source: $DBI::errstr";

### Disconnect from Database statements are completed.
$dbh->disconnect;
######### end SQL Commands 


print $sth1;

This will successfully print a number which is 189 in this instance. When I try to use the same code but change the "Type = '2'" (which should return a value of 2000) I get the following error:

DBD::ODBC::db selectrow_array failed: [Microsoft][ODBC Driver 11 for SQL Server]Numeric value out of range (SQL-22003) at ./getTotalExpSRP.cgi line 33, <DATA> line 225.
Can't connect to dbi:ODBC:BLTSS_SRP: [Microsoft][ODBC Driver 11 for SQL Server]Numeric value out of range (SQL-22003) at ./getTotalExpSRP.cgi line 33, <DATA> line 225.

I've search everywhere but I cannot find out why this happens. From the symptom of the issue I would guess that there is a limit to the size of the results returned but I cannot find any supporting evidence of this.

I have run a trace on my Microsoft SQL 2005 server and can confirm that the sql statement is being run properly with no errors.

I've viewed my odbc trace log but unfortunately I cannot derive any useful information when comparing a working example to the failed one.

Any help would be appreciated!!

Thanks,

Now we've seen the trace I can explain this. DBD::ODBC calls SQLDescribeCol and is told:

DescribeCol column = 1, name = , namelen = 0, type = unknown(0), precision/column size = 10, scale = 0, nullable = 1 display size = 11

Then it calls SQLColAttribute and is told the column size is 4. Since the column type was unknown (why the driver did that I'm not sure) DBD::ODBC decides to bind the column as a char(4) and so as soon as the count is > 3 digits it will overflow.

The version of DBI and DBD::ODBC being used here is really old and I suspect the latest versions will cope better with this.

Numeric value out of range is a type conversion error. Is TYPE supposed to be a number of a character/string? If it should be a number, use a number

my $sth1 = $dbh->selectrow_array(
    "select count(*) from TableInfo where Type=2")  # Type=2, not Type='2'

or use placeholders and let Perl and the database driver worry about type conversions

my $sth = $dbh->prepare("select count(*) from TableInfo where Type=?");
$sth->execute(2);
$sth->execute('2');     # same thing
my $st1 = $sth->fetchall_arrayref;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM