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;