Sql DBD::CSV:用户定义函数存在问题
从SQL::Statement::Functions文档中: 创建用户定义的函数Sql DBD::CSV:用户定义函数存在问题,sql,perl,csv,dbi,user-defined-functions,Sql,Perl,Csv,Dbi,User Defined Functions,从SQL::Statement::Functions文档中: 创建用户定义的函数 … 更复杂的函数可以使用一些始终自动传递给函数的参数。函数总是在@中接收这些值: sub FOO{my($self,$sth,$rowhash,@params);} 当我尝试此操作时,会收到一条错误消息: DBD::CSV::st execute失败:在./so.pl第27行的除法(/)中使用未初始化的值$\u0。 [对于语句./so.pl第34行的“选择id,例程(编号)”作为“工资”的结果] 当我注释掉第三个参
…
更复杂的函数可以使用一些始终自动传递给函数的参数。函数总是在@中接收这些值:
sub FOO{my($self,$sth,$rowhash,@params);} 当我尝试此操作时,会收到一条错误消息: DBD::CSV::st execute失败:在./so.pl第27行的除法(/)中使用未初始化的值$\u0。
[对于语句./so.pl第34行的“选择id,例程(编号)”作为“工资”的结果] 当我注释掉第三个参数时,我按照预期工作(因为看起来好像第三个参数丢失了): 0230
1106.667
2,60
3排 这是一个bug吗?同样来自文档: 使用时 SQL::语句/SQL::解析器直接到 解析SQL、函数(或 可能会出现内置或用户定义的错误 SQL语句中 值、列名、表名或 谓词可能出现。使用时 模块通过DBD或任何 SQL所在的其他上下文 解析和执行的函数 可能发生在相同的地方,除了 它们不能出现在列中 SELECT的selection子句 包含FROM子句的语句 i、 e 这是行不通的 重写函数以返回一个表,如下所示:
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
您也可以原样尝试,不使用$rowhash,但SEM喜欢依赖未记录的,并且可能会改变行为。问题不在于你的函数不能正常工作,而在于它能正常工作,基于文档。如果我对docu这一部分的解释是正确的,那么内置函数也是如此——这很遗憾。
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