从SQL语句:: ::功能文档:关于产品:DBD :: CSB语句的功能
功能语法
当使用SQL语句::/SQL ::解析器直接解析SQL ,函数(内置的或用户定义的)可能发生在SQL语句中可能出现值,列名,表名或谓词的任何地方。当通过DBD或在任何其他可以解析和执行SQL的上下文中使用模块时,函数可以在相同的位置出现,只是它们不会出现在包含FROM子句的SELECT语句的列选择子句中。
#有效期为两解析和仅用于解析执行
SELECT MyFunc(args);
SELECT * FROM MyFunc(args);
SELECT * FROM x WHERE MyFuncs(args);
SELECT * FROM x WHERE y < MyFuncs(args);
#有效(不会从DBD工作)
SELECT MyFunc(args) FROM x WHERE y;
读这个我期望我的例子中的第一个SELECT语句不应该工作,第二个SELECT语句应该是相反的。
#!/usr/bin/env perl
use warnings; use strict;
use 5.010;
use DBI;
open my $fh, '>', 'test.csv' or die $!;
say $fh "id,name";
say $fh "1,Brown";
say $fh "2,Smith";
say $fh "7,Smith";
say $fh "8,Green";
close $fh;
my $dbh = DBI->connect ('dbi:CSV:', undef, undef, {
RaiseError => 1,
f_ext => '.csv',
});
my $table = 'test';
say "\nSELECT 1";
my $sth = $dbh->prepare ("SELECT MAX(id) FROM $table WHERE name LIKE 'Smith'");
$sth->execute();
$sth->dump_results();
say "\nSELECT 2";
$sth = $dbh->prepare ("SELECT * FROM $table WHERE id = MAX(id)");
$sth->execute();
$sth->dump_results();
输出:
SELECT 1
'7'
1行选择2
未知函数 'MAX' 在/usr/lib/perl5/site_perl/5.10 .0/SQL/Parser.pm line 2893.
DBD :: CSV :: db prepare failed:/usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm line 2894处的未知函数'MAX'。
[for statement“SELECT * FROM test WHERE id = MAX(id)”] at ./so_3.pl line 30.
DBD :: CSV :: db准备失败:位于/ usr/lib的未知函数'MAX' /perl5/site_perl/5.10.0/SQL/Parser.pm线2894
[for语句 “SELECT * FROM测试WHERE ID = MAX(ID)”]在./so_3.pl线30
有人能解释我这种行为吗?
当我尝试这个,我得到这个错误 - 消息: 错误的表或列名:'(select MAX(id)FROM test)'的字符不是字母数字或下划线!在/usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm第2893行。 DBD :: CSV :: db准备失败:错误的表或列名称:'(select MAX(id)FROM test)'字符不是字母数字或下划线!在/usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm 2894行。 [for语句“SELECT * FROM test WHERE id =(select MAX(id)FROM test)”] at ./so_3.pl line 32. – 2010-06-05 14:42:38
@sid_com - 然后首先执行 - 选择MAX(id)FROM $ table - put结果在一个变量(比如$ max_id)并执行第二个查询: SELECT * FROM $ table WHERE id = $ max_id – msi77 2010-06-05 17:35:27
这是否意味着“Select MAX(id)FROM $ table WHERE id = $ max_id”是OK ?关注“#仅用于解析(不会从DBD工作) - SELECT MyFunc(args)FROM x WHERE y;”只有用户定义的功能? – 2010-06-06 06:34:50