在 Perl 脚本中运行 PL/SQL 过程
Posted
技术标签:
【中文标题】在 Perl 脚本中运行 PL/SQL 过程【英文标题】:Running a PL/SQL procedure in a Perl script 【发布时间】:2012-07-23 12:38:57 【问题描述】:我有一个 Perl 脚本,它接受一个文件作为输入,其中包含 PL/SQL(用于语句和 DBMS_OUTPUT.PUT_LINE
)。我需要运行建立一个数据库连接并在 Perl 脚本中运行该文件。pl/sql 有 Begin declare end 部分,上面有 for 语句,它正在写入使用逗号分隔的 3 列的数据(DBMS_OUTPUT.PUT_LINE)我已经展示了什么我在下面尝试过。对吗?
my $dbh = DBI->connect( "dbi:Oracle:$db", $username, $passwd ) ||
die( $DBI::errstr . "\n" );
$dbh->AutoCommit = 0;
$dbh->PrintError = 1;
open FILE, $sql_file or die "Could not open file";
$query = '';
while($line = <FILE>)
chomp($line);
$query .= $line;
my $sth = $dbh->prepare($query);
$sth->execute();
while ( my @row = $sth->fetchrow_array() )
foreach (@row)
print "$_";
print "\n";
【问题讨论】:
可以方便地让我们了解文件中可能包含的内容。你提到程序,然后什么都不显示。 pl/sql 是否有围绕它的开始/结束块等。它如何产生结果集 - 给定你的 perl 建议它可能。 它可以工作还是打印错误消息?此外,您应该始终使用use strict
和use warnings
,并且您应该习惯open
的三参数形式,这比您使用的形式更安全..
【参考方案1】:
$sth->fetch()
、$sth->fetchrow_*()
和朋友都从结果集中获取记录。在 Oracle PL/SQL 中,块通常不返回结果集。所以在运行 PL/SQL 块后调用 $sth->fetchrow_array()
不会返回任何结果。
如果您使用DBMS_OUTPUT.PUT_LINE
输出结果,则需要使用dbms_output_*
functions provided by DBD::Oracle。
my $dbms_output_byte_limit = 1000000;
$dbh->func( $dbms_output_byte_limit, 'dbms_output_enable' );
my $sth = $dbh->prepare($query);
$sth->execute();
my @text = $dbh->func( 'dbms_output_get' );
【讨论】:
如果我有一个 for 语句,它的 DBMS_OUTPUT.PUTLINE 连续运行 1000000 行。那么@text 将有 1000000 个元素? 是的,您还需要增加$dbms_output_byte_limit
来保存这么多数据。但是,此时您真的应该寻找比dbms_output
更好的方法来返回您的数据。以上是关于在 Perl 脚本中运行 PL/SQL 过程的主要内容,如果未能解决你的问题,请参考以下文章