DBD :: CSV:用户定义函数问题

时间:2010-05-09 08:01:54

标签: sql perl csv dbi user-defined-functions

来自SQL :: Statement :: Functions文档:

  

创建用户定义的功能
  ...
  更复杂的函数可以使用多个自动传递给函数的参数。函数始终在@_:
中接收这些值   sub FOO {my($ self,$ sth,$ rowhash,@ params); }

#!/usr/bin/env perl
use 5.012;
use warnings; use strict;
use DBI;

my $dbh = DBI->connect( "DBI:CSV:", undef, undef, { RaiseError => 1, } );
my $table = 'wages';
my $array_ref = [   [ 'id', 'number' ],  
            [ 0, 6900 ], 
            [ 1, 3200 ], 
            [ 2, 1800 ],    ];

$dbh->do( "CREATE TEMP TABLE $table AS import( ? )", {}, $array_ref );

sub routine {
    my $self = shift;
    my $sth = shift;
    my $rowhash = shift; #
    return $_[0] / 30; 
};

$dbh->do( "CREATE FUNCTION routine" );
my $sth = $dbh->prepare( "SELECT id, routine( number ) AS result FROM  $table" );
$sth->execute();
$sth->dump_results();

当我尝试这个时,我收到一条错误消息:

  

DBD :: CSV :: st执行失败:在./so.pl第27行的分区(/)中使用未初始化的值$ _ [0]。
  [for。语句“SELECT id,routine(number)AS result FROM”wages“”] at ./so.pl第34行。

当我注释掉第三个参数时,我按预期工作(因为它看起来好像缺少第三个参数):

#!/usr/bin/env perl
...  
sub routine {
    my $self = shift;
    my $sth = shift;
    #my $rowhash = shift;
    return $_[0] / 30; 
};
...
  

0,230
  1,106.667
  2,60   3行

这是一个错误吗?

1 个答案:

答案 0 :(得分:3)

同样来自SQL::Statement::Functions文档:

  

使用时   SQL :: Statement / SQL :: Parser直接到   解析SQL,函数(或者   可能会出现内置或用户定义的内容   在SQL语句中的任何地方   值,列名,表名或   谓词可能会发生。使用时   模块通过DBD或任何   SQL所在的其他上下文   解析和执行,功能   可以发生在相同的地方除外   它们不能出现在列中   SELECT的selection子句   包含FROM子句的语句。

即。

SELECT id, routine( number ) AS result FROM  wages

无效。

重写你的函数以返回一个表,如下所示:

sub routine {
    my($self,$sth,$rowhash,@params) = @_;
    return [ [qw(id result)],
             map { [ $_->[0], $_->[1] / 30 ] } @$array_ref ];
};

$dbh->do( "CREATE FUNCTION routine" );
my $sth = $dbh->prepare( "SELECT * FROM routine()" );
$sth->execute();
$sth->dump_results();

预期结果:

$ perl dl.pl 
0, 230
1, 106.667
2, 60
3 rows