2

Informix テーブルにレコードがあります。表の列は次のようになります。

acct_no integer,
suffix char(1),
meter_num char(20),
date_read datetime year to second not null ,
counter smallint,
reading integer not null ,
typeofread char(1),
estimated char(1),
time_billed datetime year to second

Informix の dbaccess ツールを使用:

select * 
from ws_mtrread 
where acct_no = 113091000 
and suffix = " " 
order by date_read desc;

この結果 (最新のものを表示) が返され、サフィックスに 1 つまたは 2 つのスペースを使用するかどうかに関係なく機能します。

acct_no      113091000
suffix
meter_num    34153205
date_read    2013-09-09 23:31:15
counter      0
reading      1240
typeofread   g
estimated
time_billed  2013-10-22 11:48:21

ただし、この Perl DBI クエリ

my $sql_statement = 
"select * ".
"from ws_mtrread ".
"where acct_no = ? ".
"and suffix = ? ".
"order by date_read desc ; ";

動作しません。$suffix を指定せずに行をフェッチできるので、行が存在することがわかります。

これは、接尾辞を表す際の私の側のエラーだと思います。この例では、サフィックスは 2 つのスペースの文字列と同じです。

クエリが機能するように、スペースを正しく表現するにはどうすればよいですか? 行をフェッチするために使用した残りのコードを次に示します。

my $test_acct_no = 113091000;
my $suffix = "  ";

my $pt_sel_hdl = $DBHdl->prepare($sql_statement);

$pt_sel_hdl->execute($test_acct_no, $DBHdl->quote($suffix));

my $ws_mtr_read_rec_ref = $pt_sel_hdl->fetchrow_hashref;

呼び出し後、$ws_mtr_read_rec_ref は未定義です。

4

1 に答える 1

4

quoteここではDBIの方法を使用しないでください:

$pt_sel_hdl->execute($test_acct_no, $DBHdl->quote($suffix));

SQL でプレースホルダーを使用する?と、データベース ドライバーは、に渡すクエリ引数を正しくパラメーター化しますexecute" "検索したいときに、リテラル文字列 (引用符を含む) を検索するクエリを作成している可能性があります(2 つのスペースのみ)。

したがって、必要なのはこれだけです。

$pt_sel_hdl->execute($test_acct_no, $suffix);
于 2013-10-28T16:20:07.737 に答える