将 sqlplus 命令的输出保存到数组中的任何可能方法 - Perl

Posted

技术标签:

【中文标题】将 sqlplus 命令的输出保存到数组中的任何可能方法 - Perl【英文标题】:Any possible way to save output of sqlplus command into an array - Perl 【发布时间】:2013-01-22 10:25:12 【问题描述】:

目前,我正在将 sqlplus 命令假脱机到一个文本文件中,但即使这样也给我带来了问题,因为我想用逗号分隔值。到目前为止还没有成功。

我希望这样的事情会奏效

 @test = system('sqlplus un/pw@host @test.sql');

test.sql 文件包含三个返回数字的语句。如果我可以将这些保存到 @test 数组中,那就太好了。

有什么想法吗?

【问题讨论】:

system 不返回标准输出,它返回系统调用的返回值。要捕获输出,请使用反引号或 qx(),但您需要转义 @ 字符以避免插值。但是,如果您要查询数据库,则最好使用 DBI 模块。 check this:theunixshell.blogspot.com/2013/01/… .where 在这里它使用 sybase 只是删除 sybase 部分并放入 sqlplus 而不是 isql。剩下的它将结果的每一行存储到一个数组中。 【参考方案1】:

将DBI 模块与DBD::Oracle 一起使用:

#!/usr/bin/perl
use warnings;
use strict;

use DBI;

my $dbh = DBI->connect("dbi:Oracle:host=host;sid=dbname",
                       $user, $password);

open my $IN, '<', 'test.sql' or die $!;
$/ = ';'; # Queries separated by semicolons, no other semicolons anywhere!
while (my $sql = <$IN>) 
    my $sth = $dbh->prepare($sql);
    $sth->execute;
    my @test = @ $sth->fetchall_arrayref // [] ;
    print "@$_\n" for @test;

【讨论】:

【参考方案2】:

基于 DBI 脚本很好,但如果你的观点是关于在任何情况下使用 sqlplus 命令,你应该看看这个 CPAN 模块:Expect。它以多种有用的方式让您更深入地控制外部命令。

【讨论】:

以上是关于将 sqlplus 命令的输出保存到数组中的任何可能方法 - Perl的主要内容,如果未能解决你的问题,请参考以下文章

sqlplus将查询结果重定向到文件,不输出到屏幕

在 sqlplus 中使用假脱机运行多个查询

sqlplus 命令问题

sqlplus中怎么将你全部的操作和结果记录保存到你指定的文件里

输入/输出从命令行可执行文件重定向到文件

从 sqlplus 中的过程将输出写入文件 - SPOOL