Perl массив печатает на нескольких строках, но должен быть одной строкой - PullRequest
0 голосов
/ 26 марта 2019

ОБНОВЛЕНИЕ: Добавлены Data :: Dumper в соответствии с запросом, и вывод выглядит следующим образом:

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

Проще говоря, я ожидаю 1 строку с двумя элементами, но я получаю две строки с 1 элементом, используя функции Perl, которыепроизводить ожидаемые результаты в других скриптах.Я не могу понять, почему я получаю эти результаты.

Я добавил две функции в приведенном ниже коде, чтобы сохранить все это как один сценарий для тестирования, но они хранятся в общем сценарии 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...