2010-06-05 84 views
0

从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

有人能解释我这种行为吗?

回答

0

尝试此

$某物= $ dbh->制备( “SELECT * FROM $表WHERE ID = (选择MAX(ID)FROM $表)”);

+0

当我尝试这个,我得到这个错误 - 消息: 错误的表或列名:'(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

+0

@sid_com - 然后首先执行 - 选择MAX(id)FROM $ table - put结果在一个变量(比如$ max_id)并执行第二个查询: SELECT * FROM $ table WHERE id = $ max_id – msi77 2010-06-05 17:35:27

+0

这是否意味着“Select MAX(id)FROM $ table WHERE id = $ max_id”是OK ?关注“#仅用于解析(不会从DBD工作) - SELECT MyFunc(args)FROM x WHERE y;”只有用户定义的功能? – 2010-06-06 06:34:50

0

我今天看到类似的情况。我发现,如果我这样做:

my $foo = $dbh->prepare("SELECT * FROM $table"); 
    if($foo) { 
     $foo->finish(); 
    } 
    #run your prepare here 

直接之前使用UDF或函数的查询时,错误走了......我就用它:)