0

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 ステートメントは機能せず、2 番目の 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 行

SELECT 2
/usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm 行 2893 に不明な関数 'MAX' があります。DBD
::CSV::db の準備に失敗しました: /usr/lib/ に不明な関数 'MAX' がありますperl5/site_perl/5.10.0/SQL/Parser.pm 行 2894.
[ステートメント "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'
。 .pl 行 30。

誰かが私にこの振る舞いを説明してもらえますか?

4

2 に答える 2

0

これを試して

$sth = $dbh->prepare ( "SELECT * FROM $table WHERE id = (select MAX( id ) FROM $table)" );

于 2010-06-05T10:15:07.877 に答える
0

今日、これに似たことが起こっているのを見ました。私がした場合:

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

UDFまたは関数を使用したクエリの直前に、エラーはなくなりました...私はそれを使いました:)

于 2011-05-05T23:02:37.787 に答える