このタイプの質問には、「DBIを使用できないため...」という前に付ける必要があります。可能な限りDBIを使用したいからです。あなたはそれを使わない正当な理由があるかもしれません、しかし多分、あなたの理由があまり良くない理由とそれについて何をすべきかをあなたに話すことができます。そうは言っても、フォークとファイルハンドルを使用して、一度に1行ずつ出力を取得することで、要求したことを実行する1つの方法があります(警告:このようなプロセスに印刷しすぎると、バッファーの問題が原因でブロックされる可能性があります):
use strict;
use warnings;
pipe(my($p_rdr, $c_wtr)) or die "Err: $!";
pipe(my($c_rdr, $p_wtr)) or die "Err: $!";
my $pid = fork;
die "Could not fork: $!" unless defined $pid;
unless ($pid) {
close $p_rdr;
close $p_wtr;
open(STDOUT, ">&=", $c_wtr) or die "dup: $!";
open(STDIN, "<&=", $c_rdr) or die "dup: $!";
print "Exec sqlplus\n";
exec qw(sqlplus user/passwd@dbname);
die "Could not exec: $!";
}
close $c_wtr;
close $c_rdr;
print "Print sql\n";
print $p_wtr "select * from table_name where col1 = 'something';\n";
print "Close fh\n";
close $p_wtr;
print "Read results\n";
while (<$p_rdr>) {
print "O: $_";
}
close $p_rdr;