ОБНОВЛЕНИЕ: Добавлены 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;