bind_columns вызывается с 1 значением, но необходимо 2

Я пытаюсь понять, почему у меня возникла следующая проблема.

Я пишу небольшой скрипт на Perl, беру несколько примеров здесь и там, добавляя некоторые свои.

Что я делаю, так это храню запросы в файле cfg, извлекаю их в соответствии с переданным аргументом, выполняю и возвращаю значение.

use strict;
use warnings;
...
$comm = 'tablespace_critical'; # In the real script, this is a command-line argument.
...
my $query = "$CFG::CFG{'checks'}{$comm}{'query'}";
# this part was literally copied from another script
# that didn't used the strict and warnings.
#---------------------------------------------------
my $query_handle = $dbh->prepare($query);
my $result;

$query_handle->execute();
$query_handle->bind_columns( \$result);
$result=$query_handle->fetchrow_array();
$query_handle->finish;
$dbh->disconnect();
#---------------------------------------------------

*.Cfg

%CFG = (
    'tablespace_critical' => {
        'query'     => "select x\.tablespace_name,x\.used_pct from (select a\.tablespace_name,((total_space-free_space)/total_space)*100 used_pct from (select tablespace_name,sum(bytes)/(1024*1024) total_space from dba_data_files group by tablespace_name) a, (select tablespace_name,sum(Bytes)/(1024*1024) free_space from dba_free_space group by tablespace_name) b where a\.tablespace_name = b\.tablespace_name(+)) x, mon_control y where x\.tablespace_name = y\.name(+) and y\.monitoring_type (+) = 'TABLESPACE' and x\.used_pct >= decode (y\.err_value,-1,NULL,NULL,90,y\.err_value)"
    }    
)

В оригинальном сценарии это работало без каких-либо проблем, но здесь я получаю bind_columns called with 1 values but 2 are needed, В конфиге хранится несколько запросов, и только этот доставляет проблемы. Perl - не мое дело, поэтому у меня все еще есть слабые концепции, над которыми я работаю, но я уже потратил много времени, поэтому надеюсь, что вы мне поможете.

С уважением.

1 ответ

Решение

Вы выполняете запрос, который извлекает два значения:

select x.tablespace_name, x.used_pct from ... 
       ^^^                ^^^
       1st field          2nd field

Следовательно bind_columns ожидает, что вы также свяжете два скаляра.

$query_handle->bind_columns( \$result);    # <-- only a single variable

Если вы хотите получить переменное количество полей, не беспокойтесь о привязке столбцов, а просто используйте fetchrow_array:

$query_handle->execute();
my @result = $query_handle->fetchrow_array();
Другие вопросы по тегам