我试图理解为什么我有以下问题。
我正在写一个小的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不是我真的,所以我仍然有一些我正在研究的弱概念,但我已经花了很多时间,所以我希望你能帮我一臂之力。
问候。
答案 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();