Вопрос о DBD :: CSB Statement-Функции - PullRequest
0 голосов
/ 05 июня 2010

Из документации SQL :: Statement :: Functions:

Синтаксис функции

При использовании SQL :: Statement / SQL :: Parser напрямую для синтаксического анализа SQL функции (встроенные или определяемые пользователем) могут встречаться в любом месте оператора SQL, где могут возникать значения, имена столбцов, имена таблиц или предикаты. , При использовании модулей через DBD или в любом другом контексте, в котором SQL анализируется и выполняется, функции могут появляться в одних и тех же местах, за исключением того, что они не могут встречаться в предложении выбора столбца оператора SELECT, который содержит предложение FROM.

# действительно как для разбора, так и для выполнения

 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();

выходы:

ВЫБРАТЬ 1
'7'
1 ряд

ВЫБРАТЬ 2
Неизвестная функция 'MAX' в /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm строка 2893.
DBD :: CSV :: db подготовить не удалось: неизвестная функция 'MAX' в /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm строка 2894.
[для оператора «SELECT * FROM test WHERE id = MAX (id)»] в строке ./so_3.pl 30.
DBD :: CSV :: db подготовить не удалось: неизвестная функция 'MAX' в /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm строка 2894.
[для оператора «SELECT * FROM test WHERE id = MAX (id)»] в строке ./so_3.pl 30.

Может ли кто-нибудь объяснить мне это поведение?

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Я видел нечто похожее на это сегодня. Я обнаружил, что если бы я сделал:

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

непосредственно перед запросом, который использовал UDF или функцию, ошибка исчезла ... Я пошел с ней:)

0 голосов
/ 05 июня 2010

Попробуйте это

$ sth = $ dbh-> prepare ("SELECT * FROM $ table WHERE id =" (выберите MAX (id) FROM $ table) ");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...