PerlのDBIでバインド変数を使用したSQLがエラーになる場合の対処法
Wondows 上の ActivePerl から DBIモジュールを使って、ODBC 経由で DB に接続した場合、なぜかバインド変数を使用した SQL がエラーになることがあるんですよ。
例えば次のようなソースだと、execute するところでエラーになるんです。
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect("dbi:ODBC:hoge","hoge","fuga"); my $sql = "select name from item where code=?"; my $sth = $dbh->prepare($sql); open(FH, "<", "item_codes.txt"); while(<FH>){ chomp; $sth->execute($_); while(my @data = $sth->fetchrow_array()){ # いろいろ処理 } } close(FH); $dbh->disconnect();
SQL を書き間違えたかな? と思ってチェックしてみるものの、他のツールを使用して ODBC 経由で SQL を実行するとちゃんと処理されるんですよね。
もっとも、チェックの時にはバインド変数は使ってませんけど。
だったら、バインド変数を使わなければいいんじゃね? という発想のもと、ソースを以下のように書き換えてみると・・・、
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect("dbi:ODBC:hoge","hoge","fuga"); open(FH, "<", "item_codes.txt"); while(<FH>){ chomp; my $sql = "select name from item where code='$_'"; my $sth = $dbh->prepare($sql); $sth->execute(); while(my @data = $sth->fetchrow_array()){ # いろいろ処理 } } close(FH); $dbh->disconnect();
今度はちゃんと動くじゃないですかぁ!
理由とか原因はさっぱり分からないのですが、とりあえず動いたからまぁいいか。