Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DBD::CSV:用户定义函数存在问题_Sql_Perl_Csv_Dbi_User Defined Functions - Fatal编程技术网

Sql DBD::CSV:用户定义函数存在问题

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,例程(编号)”作为“工资”的结果] 当我注释掉第三个参

从SQL::Statement::Functions文档中:

创建用户定义的函数

更复杂的函数可以使用一些始终自动传递给函数的参数。函数总是在@中接收这些值:
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