DBD::CSV and placeholders

不问归期 提交于 2019-12-20 02:34:25

问题


#!/usr/bin/env perl
use warnings;
use strict;
use DBI;

my $dbh = DBI->connect( "DBI:CSV:", '', '', { RaiseError => 1 } ) or die DBI->errstr;

my $table = 'my_test_table_1.csv';
$dbh->do( "CREATE TEMP TABLE $table( id INTEGER, name CHAR(64) )" );

my $sth = $dbh->prepare( "INSERT INTO $table ( id, name ) VALUES( ?, ? )" );
$sth->execute( 1, 'Ruth' );
$sth->execute( 2, 'John' );
$sth->execute( 3, 'Nena' );
$sth->execute( 4, 'Mark' );

$sth = $dbh->prepare( "SELECT * FROM $table WHERE id > ? LIMIT ?" );
$sth->execute( 1, 2 );
$sth->dump_results;

# Bad limit clause! at /usr/local/lib/perl5/site_perl/5.20.1/SQL/Statement.pm line 88.

It looks like a placeholder in the LIMIT clause doesn't work.

How can I tell if placeholders are supported in a certain place in a SQL statement when I use the DBD::CSV driver?


回答1:


Placeholders can only be used where an expression is expected. What follows LIMIT must be a row count (not an expression), so it can't be a placeholder.

#!/usr/bin/perl
use warnings;
use strict;
use DBI qw( );

my $dbh = DBI->connect("DBI:CSV:", undef, undef, {
   PrintError => 0, RaiseError => 1,
} );

{
   my $sth = $dbh->prepare( "SELECT 1 LIMIT 1" );
   $sth->execute();
   $sth->finish();
   print "ok\n";
}

{
   my $sth = $dbh->prepare( "SELECT 1 LIMIT 0+1" );
   $sth->execute();
   $sth->finish();
   print "ok\n";
}

ok
DBD::CSV::db prepare failed: Bad limit clause! at .../SQL/Statement.pm line 88.
 [for Statement "SELECT 1 LIMIT 0+1"] at a.pl line 18.



回答2:


According to documentation, placeholders can be use only for values.



来源:https://stackoverflow.com/questions/28153290/dbdcsv-and-placeholders

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!