关于DBD :: CSB语句功能的问题

时间:2010-06-05 08:23:43

标签: sql perl function csv dbd

来自SQL :: Statement :: Functions文档:

  

功能语法

     

当直接使用SQL :: Statement / SQL :: Parser解析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语句不起作用,第二个应该是,但它恰恰相反。

#!/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
  /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm第2893行的未知函数'MAX'。
  DBD :: CSV :: db准备失败:/usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm第2894行的未知函数'MAX'。
   [for。语句“SELECT * FROM test WHERE id = MAX(id)”]在./so_3.pl第30行   DBD :: CSV :: db准备失败:/usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm第2894行的未知函数'MAX'。
   [for。“SELECT * FROM test WHERE id = MAX(id)”] at ./so_3.pl第30行。

有人可以解释一下这种行为吗?

2 个答案:

答案 0 :(得分:0)

试试这个

$ sth = $ dbh-&gt; prepare(“SELECT * FROM $ table WHERE id =                          (选择MAX(id)FROM $ table)“);

答案 1 :(得分:0)

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

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

直接在使用UDF或函数的查询之前,错误就消失了......我去了它:)