2014-09-03 3 views
0

Im пытается понять, почему у меня есть следующая проблема.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(); 
#--------------------------------------------------- 

The * .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. В конфиге хранится несколько запросов, и это единственное, что дает проблемы. Перл - это не мое дело, поэтому у меня все еще есть некоторые слабые концепции, над которыми я работаю, но я потратил много времени, поэтому надеюсь, что вы можете дать мне руку.

С уважением.

ответ

2

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

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(); 
+0

Это было мое мышление, но потом, как я уже говорил в сниппета , другой скрипт, который делает то же самое с одним и тем же запросом (я консолидирую все сценарии, которые делают то же самое в одном) работает! Я думаю, что больше, чем решение проблемы (что, по вашему мнению, вероятно, будет, посмотрим), то, что я хочу сделать, это понять, что там происходит. Я думаю, из-за строгой, но я действительно не могу сказать. –

 Смежные вопросы

  • Нет связанных вопросов^_^