2010-06-05 3 views
0

: SQL : 문/SQL을 사용하는 경우질문은 SQL : 문 : 기능 문서에서

기능 구문은

:: 파서 직접 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); 

#을 실행 (A DBD에서 작동하지 않습니다)는

SELECT MyFunc(args) FROM x WHERE y; 

내가 예상이 읽기 내 예제의 첫 번째 SELECT 문은 작동하지 않아야하며 두 번째 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 행

가 /usr/lib/perl5/site_perl/5.10에서 2
알 기능 'MAX'를 선택

를 선택 .0/SQL/Parser.pm 라인 2893.
DBD :: CSV :: db 준비 실패 : /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm 라인 2894에서 알 수없는 함수 'MAX'가 실패했습니다. ./so_3.pl 라인 30. "SELECT * FROM test WHERE id = MAX (id)"] 문에 대해
DBD :: CSV :: db 준비 실패 : 알 수없는 함수 '/ usr/lib'의 'MAX' /perl5/site_perl/5.10.0/SQL/Parser.pm 라인 2894.
[성명은 "시험 * FROM WHERE ID = MAX (ID)"] ./so_3.pl 라인에서 30

누군가 나에게이 행동을 설명 할 수 있습니까?

답변

0

보십시오이

$ STH = $ dbh-> 준비 ("$ 테이블 SELECT * FROM WHERE ID = (MAX ($ 테이블에서 ID를))을 선택합니다");

+0

나는이 오류 -를 얻을 ...

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

는 UDF 또는 함수를 사용하는 쿼리가 오류가 도망 갔어요 바로 전에 : 내가 그랬다면 것을 발견 메시지 : 잘못된 테이블 또는 열 이름 : '(MAX (ID) FROM 테스트 선택)'의 문자는 영숫자 또는 밑줄이 아닙니다! /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm 라인 2893. DBD :: CSV :: db 준비 실패 : 잘못된 테이블 또는 열 이름 : '(MAX (ID) FROM 테스트 선택)' 영숫자 또는 밑줄이 아닌 문자가 있습니다! /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm 라인 2894에 있습니다. [for * statement for "SELECT * FROM test ="(MAX (id) FROM 테스트 선택 ")]. –

+0

@sid_com - 그런 다음 먼저 실행 - MAX (id) FROM $ table - put을 선택하십시오. 두 번째 쿼리를 실행하십시오. SELECT * FROM $ table WHERE id = $ max_id – msi77

+0

"Select MAX (id) FROM $ table WHERE id = $ max_id"는 OK입니다. ? "DBD에서 작동하지 않습니다. - SELECT MyFunc (args) FROM x WHERE y;" 사용자 정의 함수 만? –

0

오늘 이와 비슷한 것이 보입니다. 나는 그것으로 갔다 :) 나는이 때