Из документации SQL :: Statement :: Функции:Вопрос о DBD :: КСБ Statement-функций
Синтаксис функции
При использовании 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 строкиSELECT 2
неизвестной функции 'MAX' в /usr/lib/perl5/site_perl/5.10 .0/SQL/Parser.pm строка 2893.
DBD :: CSV :: db prepare failed: Неизвестная функция 'MAX' на /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm строке 2894.
[for Statement "SELECT * FROM test WHERE id = MAX (id)"] в ./so_3.pl строка 30.
DBD :: CSV :: db prepare failed: Неизвестная функция 'MAX' в/usr/lib /perl5/site_perl/5.10.0/SQL/Parser.pm линии 2894.
[для постановки "SELECT * FROM тест, где ID = MAX (ID)"] в ./so_3.pl линии 30.
Может ли кто-нибудь объяснить мне такое поведение?
Когда я пытаюсь это я получаю эту error- сообщения: Плохое имя таблицы или столбца: '(выберите MAX (id) FROM test)' имеет символы не буквенно-цифровые или подчёркивающие! на странице /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm строка 2893. DBD :: CSV :: db prepare failed: неверное имя таблицы или столбца: '(выберите MAX (id) FROM test)' имеет символы не буквенно-цифровые или подчеркивающие! на странице /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm строки 2894. [for Statement "SELECT * FROM test WHERE id = (выберите MAX (id) FROM test)"] в ./so_3.pl строке 32. –
@sid_com - Затем сначала выполните - выберите MAX (id) FROM $ table - put результат в переменной (скажем, $ max_id) и выполнить второй запрос: SELECT * FROM $ table WHERE id = $ max_id – msi77
Означает ли это, что «Выберите MAX (id) FROM $ table WHERE id = $ max_id" в порядке ? Обеспокоена «# действительна только для синтаксического анализа (не будет работать из DBD) - SELECT MyFunc (args) FROM x WHERE y;" только пользовательские функции? –