0

このスクリプトは、%ワイルドカードを必要としないすべてのコマンドで正常に機能します。?をラップしようとすると %?%で、バインドエラーが発生します。また、スクリプトの実行時に引数に%value%を追加しようとしましたが、同じエラーが発生します。perlのSQLDBIコマンドに引数を置き換える方法はありますか?

前もって感謝します。

#!/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;
4

2 に答える 2

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);

ただし、そのメリットはなく、互換性のない 構文を使用するリスクがあります。

于 2012-10-07T23:04:55.817 に答える
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
于 2012-10-07T21:54:51.280 に答える