来自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行
这是一个错误吗?
答案 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