此脚本适用于所有不需要%通配符的命令。当我试图包裹?在%?%中产生绑定错误。此外,我尝试在运行脚本时向参数添加%value%,它也会产生相同的错误。有没有办法在Perl中将参数替换为SQL DBI命令?
提前谢谢。
#!/usr/bin/perl
use DBI;
use Text::Diff;
use File::stat;
use Fcntl ':flock';
open (LOCK_FH, $0) || die "$0 for lock: $!\n";
flock (LOCK_FH, LOCK_EX|LOCK_NB) || die "$0 already running\n";
$BINDVAR = $ARGV[0];
$dbname = "COnnectionDetailsHere";
$un = "username";
$pw = "password";
my $dbh = DBI->connect ( $dbname, $un, $pw, { PrintError=>1, RaiseError=>1, AutoCommit=>0, LongReadLen=>5056}) or die "Couldn't connect to DB: " . DBI->errstr;
$sql = <<SQL
select * from foo where bar like '%?%' '?'
SQL
;
$stm = $dbh->prepare($sql) or die "SQL failed to prepare $DBI::errstr\n";
$stm->bind_param(1,($BINDVAR));
$stm->execute() or die "Couldn't execute the statement: " . $stm->errstr;
答案 0 :(得分:4)
它没有添加导致问题的%
,它正在添加引号。 ?
是占位符。 '?'
是一个字符串文字,用于评估问号。
之前的回答有效地建议您将连接移动到Perl端。
my $sth = $dbh->prepare('SELECT * FROM foo WHERE bar LIKE ?');
$sth->execute('%' . $something . '%');
您可以使用正确的语法在服务器中继续执行此操作。
my $sth = $dbh->prepare(q{SELECT * FROM foo WHERE bar LIKE '%' || ? || '%'});
$sth->execute($something);
但是没有任何好处,使用incompatible syntax会有风险。
答案 1 :(得分:2)
将%
放入变量中,不要在 ?
周围加上引号。这就是搞砸了你 - 引号把它变成了一个字面问号。
#!/usr/bin/env perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');
$dbh->do('CREATE TABLE foo ( bar text )');
$dbh->do(q(INSERT INTO foo VALUES ('xyzzy')));
my $sth = $dbh->prepare('SELECT * FROM foo WHERE bar LIKE ?');
$sth->execute('%');
print $sth->fetchrow_array . "\n";
输出:
$ ~/src/tmp/like_qry
xyzzy