Perl数组可在多行上打印,但应为一行

时间:2019-03-25 23:22:51

标签: arrays perl output

更新:按要求添加了Data :: Dumper,输出如下:

$VAR1 = [
          [
            '99'
          ],
          [
            'SELECT COUNT (1) FROM all_tables;'
          ]
        ];
values = 99
values = SELECT COUNT (1) FROM all_tables;

简而言之,我期望使用带有两个元素的1行,但是使用perl函数在其他脚本中产生预期的结果却得到具有1个元素的两行。我似乎无法弄清楚为什么我得到这些结果。

我在下面的代码中添加了两个函数,以将它们全部保留为一个测试脚本,但由于它们在整个代码库中都使用,因此存储在共享的“实用程序” perl脚本中。我还在表格下方提供了用于重现此问题的表格和数据。我正在使用Perl v5.10.1和Oracle 11.2.0。

这是运行脚本时的结果:

values = 99
values = SELECT COUNT (1) FROM all_tables;

这是脚本:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $schema = "ULVR_CDM";

    my $mkt_query = "SELECT sql_id, sql_statement FROM cdm_ref_qbr_sql WHERE sql_type = 'MARKET' AND status = 'A' and sql_id=99;";
     my @slqry_result = get_query_result_multiple_rows($mkt_query,$schema);
     print Dumper \@slqry_result;
    foreach my $rows (@slqry_result) {
        print "values = @$rows\n";
    }

exit 0;

sub get_query_result_multiple_rows {
    # Query returns multiple rows. Each row is split into a list where column separator is '|'.
    # Returns a list of lists.
    my ($query, $user) = @_;
    my @array;
    my $query_result = sql_query( "$query", "$user");
    my @query_result_lines = split(/\n/, $query_result);
    foreach my $line (@query_result_lines) {
        $line =~ s/\t//g;
        $line =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
        my @fields = split (/\s*\|\s*/, $line);
        push @array, [ @fields ];
    }
    return @array;
}

sub sql_query {
    my ($query, $user) = @_;
    my $query_cmd = "/opt/u01/app/oracle/product/11.2.0/client_1/bin/sqlplus -s ULVR_CDM_USER/xxxxxxx\\\@d2ulvr <<EOF
set echo off
set newpage 0
set space 0
set pagesize 0
set feedback off
set heading off
set trimspool on
set tab off
set colsep |
set linesize 10000
whenever sqlerror exit sql.sqlcode
$query
exit 0
EOF";
    my $result = `$query_cmd`;
    die "Error : $0 : sql query failed : \n$query\n$result\n\n" if ($? != 0);
    chomp($result);
    $result =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
    return $result;
}

创建表并填充的代码:

CREATE TABLE CDM_REF_QBR_SQL
( SQL_ID NUMBER,
  SQL_TYPE VARCHAR2(10),
  SQL_STATEMENT VARCHAR2(4000)
);

INSERT INTO CDM_REF_QBR_SQL (SQL_ID, SQL_TYPE, SQL_STATEMENT)
VALUES ( 99,'MARKET', 'SELECT COUNT (1) FROM all_tables;');
COMMIT;

0 个答案:

没有答案