Perl脚本中的SQL*Plus

Vij*_*jay 5 unix oracle shell perl sqlplus

我正在尝试使用SQL*Plus连接到表并在Perl脚本中获取数据并将该输出存储在Perl变量中.

在shell脚本中我会这样做:

    SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF
    ${SQLPLUS_SETTINGS}
    select foo||'|'||bar ||'|'|| xyz from temp where dfg='some';
    exit;
    EOF`
Run Code Online (Sandbox Code Playgroud)

但是我怎么能在Perl中做到这一点?

Rob*_*t P 10

查看DBI模块.事实上,有一个专门的网站:dbi.perl.org.另外,请查看DBI的CPAN模块参考.

这是一个代码示例,直接来自谷歌上的第一个DBI教程:

    use DBI;

    my $dbh = DBI->connect('DBI:Oracle:payroll')
        or die "Couldn't connect to database: " . DBI->errstr;
    my $sth = $dbh->prepare('SELECT * FROM people WHERE lastname = ?')
        or die "Couldn't prepare statement: " . $dbh->errstr;

    $sth->execute($lastname)             # Execute the query
        or die "Couldn't execute statement: " . $sth->errstr;

    # Read the matching records and print them out          
    while (@data = $sth->fetchrow_array()) {
        my $firstname = $data[1];
        my $id = $data[2];
        print "\t$id: $firstname $lastname\n";
    }
    if ($sth->rows == 0) {
      print "No names matched `$lastname'.\n\n";
    }
    $sth->finish;
    print "\n";
    print "Enter name> ";

    $dbh->disconnect;
Run Code Online (Sandbox Code Playgroud)

Perl也有EOF风格的多线评论; 你可以像这样做一个长查询:

my $query = <<'END_QUERY';
${SQLPLUS_SETTINGS}
select foo||'|'||bar ||'|'|| xyz from temp where dfg='some';
exit;
END_QUERY
Run Code Online (Sandbox Code Playgroud)


cms*_*cms 5

如果您想针对数据库编写 Perl 脚本,那么使用 DBI 的建议很好,而且绝对是正确的做事方法。

但是,为了回答您的确切问题,如果您特别想要编写 SQL*Plus 脚本,则使用 Perl 脚本执行此操作的语法与 shell 版本非常相似

my $connect_string = 'scott/tiger@test';
my $sqlplus_settings = '';
my $result = qx { sqlplus $connect_string <<EOF
$sqlplus_settings
select 1 from dual;
exit;
EOF
};
print $result;
Run Code Online (Sandbox Code Playgroud)

我在那里使用的运算符qx只是反引号的一种礼貌形式,大括号分隔块内的所有内容都由子 shell 运行,并且输出返回到赋值。Perl 中的变量通常不是大写的。

  • 当然 - 反引号或 qx( ) 内的任何内容都将作为子 shell 运行,并且类似地捕获输出。再说一遍,我认为这不是构建 Perl 程序的好方法。 (2认同)