2010-06-05 2 views
0

Из документации 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.

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

ответ

0

Попробуйте

$ STH = $ dbh-> подготовить ("SELECT * FROM $ таблицы WHERE ID = (выберите MAX (ID) FROM $ таблицы)");

+0

Когда я пытаюсь это я получаю эту 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. –

+0

@sid_com - Затем сначала выполните - выберите MAX (id) FROM $ table - put результат в переменной (скажем, $ max_id) и выполнить второй запрос: SELECT * FROM $ table WHERE id = $ max_id – msi77

+0

Означает ли это, что «Выберите MAX (id) FROM $ table WHERE id = $ max_id" в порядке ? Обеспокоена «# действительна только для синтаксического анализа (не будет работать из DBD) - SELECT MyFunc (args) FROM x WHERE y;" только пользовательские функции? –

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^