

PerlのDBIを用いてselect文を実行し、各行を読み込み処理を行う際に

$sth->bind_columns(\$name, \$old, \$language);  
while($sth->fetch()){  
...  
}

というコードを実行しているのですが、DB上の$oldにデータが入っていない行の  
while文中の処理が省略されて、次の行に移行してしまいます。

$oldが空の場合も処理を行うようにすればどうすれば良いですか？


CC BY-SA 3.0
2016-04-29T07:03:50.893
24442
2016-06-04T04:57:13.730
15327
question
perl
Perl DBIのbind_columnについて


コメントにしようかと思ったのですが実際のコードを含むのでこちらにします。

質問にはいくつか重要な情報が抜けています。  
まずは実行可能なコードを提示し、何が問題になっているのか具体的に教えてもらえますか？

以下はSQLiteでテストした時のコードと結果です。$oldがカラでも問題なく処理されているように見えます:

[code]

    #!/usr/bin/perl
    use strict;
    use warnings;
    use DBI;
    use DBD::SQLite;
    use Data::Dumper;
    
    
    # メモリ上のデータベースハンドラ
    my $dbh = DBI->connect('DBI:SQLite:');
    
    # foo, bar, buzだけ存在するtestテーブルの作成
    $dbh->do(q{ create table test (name text, old text, language text) });
    
    # テストデータを用意する
    $dbh->do(q{
        insert into test ( name, old, language ) values ( ?, ?, ? )
    }, undef, @{$_}) for (
        ['foo1', 'bar1', 'buz1'],
        ['foo2', undef,  'buz2'], # 意図的にbar2だけ抜く
        ['foo3', 'bar3', 'buz3'],
    );
    
    # name, old, language を取得するSQL
    my $sth = $dbh->prepare(q{ select name, old, language from test });
    $sth->execute;
    
    # それぞれを $name, $old, $language に紐付ける
    my ($name, $old, $language);
    $sth->bind_columns(\$name, \$old, \$language);
    
    while ($sth->fetch()) {
        print Dumper [$name, $old, $language];
    }
    
    $dbh->disconnect;
    __END__
    $VAR1 = [
              'foo1',
              'bar1',
              'buz1'
            ];
    $VAR1 = [
              'foo2',
              undef,
              'buz2'
            ];
    $VAR1 = [
              'foo3',
              'bar3',
              'buz3'
            ];
    
[/code]


CC BY-SA 3.0
2016-06-04T04:57:13.730
25433
2016-06-04T04:57:13.730
62
24442
answer