bind_columns用1个值调用但需要2个

时间:2014-09-03 17:56:48

标签: oracle perl dbi

我试图理解为什么我有以下问题。

我正在写一个小的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 个答案:

答案 0 :(得分: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();