end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

perlのDBD::Sybaseで odisconnect invalidates 1 active statement handle エラー

DBD::Sybaseを使って、次のようなperl scriptを書いたら...

#!/usr/local/bin/perl
use strict;
use lib '/usr/local/lib/perl5/';
use lib '/usr/local/lib/perl5/site_perl/Sybase/';
use DBI;
use DBD::Sybase;

my $DBSERV = 'ないしょ';
my $DBNAME = 'ないしょ';
my $DBUSER = 'ないしょ';
my $DBPASS = 'ないしょ';
$ENV{SYBASE_SYSAM} = 'SYSAM-1_0';
$ENV{SYBASE_OCS} = 'OCS-12_0';
$ENV{SYBASE_JRE} = '/home/sybase/shared-1_0/jre1.2.2';
$ENV{SYBASE_ASE} = 'ASE-12_0';
$ENV{LD_LIBRARY_PATH_64} =
    '/home/sybase/OCS-12_0/lib:/home/sybase/OCS-12_0/lib3p64:';
$ENV{LD_LIBRARY_PATH} =
    join(':',
	 '/home/sybase/ASE-12_0/lib',
	 '/home/sybase/OCS-12_0/lib',
	 '/home/sybase/OCS-12_0/lib3p');
$ENV{PATH} = '/bin/;/usr/bin;/usr/local/bin';
$ENV{LANG} = 'ja';
$ENV{SYBASE} = '/home/sybase';

main(@ARGV);

sub main {
    my ($zumen_list) = @_;
    open(my $fh, '<', $zumen_list) or die "can't open $zumen_list $!";
    my $dbh = connect_db();

    my $sql =<<EOF;
select top 1 create_day, approve_day, obsolete_day
from plan_attr
where plan_num=? and addition_num=?
order by edition desc
EOF
    my $sth = $dbh->prepare($sql);

    while( my $tsv_line = <$fh>){
	chomp($tsv_line);
	my @tsv_cols = split("\t",$tsv_line);

	$sth->execute($tsv_cols[0],$tsv_cols[1]);
	if ( my $sql_ret = $sth->fetchrow_arrayref()){
	    print join("\t",@tsv_cols,@$sql_ret),"\n";
	} else {
	    print join("\t",@tsv_cols),"\n";
	}
    }

    $dbh->disconnect;
    close($fh) or die "can't close $zumen_list $!";
}


sub connect_db {
    my $dsn = "dbi:Sybase:server=$DBSERV;database=$DBNAME;charset=utf8";
    my $dbh = DBI->connect($dsn,
			   $DBUSER,
			   $DBPASS,
			   { RaiseError => 1, AutoCommit => 0 });
    return $dbh;
}

1;

実行結果

DBI::db=HASH(0x96c540)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at ./chk_conv.pl line 55, <$fh> line 122.
DBD::Sybase::db disconnect failed: OpenClient message: LAYER = (1) ORIGIN = (1) SEVERITY = (1) NUMBER = (49)
Server ないしょ, database 
Message String: ct_send(): ユーザ api レイヤ: 外部エラー: ほかのコマンド構造体が保留中の結果を持つので、このルーチンを呼び出すことはできません。
DBD::Sybase::db disconnect failed: OpenClient message: LAYER = (1) ORIGIN = (1) SEVERITY = (1) NUMBER = (49)
Server ないしょ, database 
Message String: ct_send(): ユーザ api レイヤ: 外部エラー: ほかのコマンド構造体が保留中の結果を持つので、このルーチンを呼び出すことはできません。

らしく、「$dbh->disconnect」前に、御行儀よく「$sth->finish」しなさいと、怒られました。

    $sth->finish;