在 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 strictuse warnings,并且您应该习惯open 的三参数形式,这比您使用的形式更安全.. 【参考方案1】:

$sth-&gt;fetch()$sth-&gt;fetchrow_*() 和朋友都从结果集中获取记录。在 Oracle PL/SQL 中,块通常不返回结果集。所以在运行 PL/SQL 块后调用 $sth-&gt;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 过程的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/SQL 执行 perl 脚本

PL/SQL 过程未返回预期结果

PL SQL 过程中的“假脱机”命令问题

在打算多次运行的 Oracle PL/SQL 脚本中,是不是需要清除集合?

运行 pl/sql 脚本时遇到问题

如何从选择查询向 PL/SQL 循环提供值