2010-06-05 9 views
0

De la SQL :: Déclaration :: documentation Fonctions:Question sur DBD :: CSB-fonctions Déclaration

Syntaxe de la fonction

Lorsque vous utilisez SQL :: Déclaration/SQL :: Parser directement à SQL Parse Des fonctions (prédéfinies ou définies par l'utilisateur) peuvent apparaître n'importe où dans une instruction SQL, à savoir que des valeurs, des noms de colonnes, des noms de tables ou des prédicats peuvent apparaître. Lors de l'utilisation des modules via un DBD ou dans tout autre contexte dans lequel le SQL est à la fois analysé et exécuté, les fonctions peuvent se produire aux mêmes endroits sauf qu'elles ne peuvent pas apparaître dans la clause column d'une instruction SELECT contenant une clause FROM.

# valable aussi bien pour l'analyse syntaxique et l'exécution

SELECT MyFunc(args); 
SELECT * FROM MyFunc(args); 
SELECT * FROM x WHERE MyFuncs(args); 
SELECT * FROM x WHERE y < MyFuncs(args); 

# valable que pour l'analyse syntaxique (ne fonctionnera pas à partir d'un DBD)

SELECT MyFunc(args) FROM x WHERE y; 

La lecture de ce que je me attends que la première instruction SELECT de mon exemple ne devrait pas fonctionner et la seconde devrait, mais c'est tout le contraire.

#!/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(); 

sorties:

SELECT 1
'7'

1 lignes

SELECT 2
Fonction inconnue 'MAX' à /usr/lib/perl5/site_perl/5.10 .0/SQL/Parser.pm ligne 2893.
DBD :: CSV :: db prepare échoué: fonction inconnue 'MAX' dans /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm ligne 2894.
[pour instruction "SELECT * FROM test WHERE id = MAX (id)"] à la ligne ./so_3.pl 30.
DBD :: CSV :: db prepare a échoué: fonction inconnue 'MAX' dans/usr/lib /perl5/site_perl/5.10.0/SQL/Parser.pm ligne 2894.
[pour Statement "SELECT * FROM test WHERE id = MAX (id)"] à la ligne de ./so_3.pl 30.

Quelqu'un pourrait-il m'expliquer ce comportement?

Répondre

0

Essayez cette

$ sth = $ dbh-> prepare ("SELECT * FROM table $ OU id = (sélectionnez MAX (id) de la table de $)");

+0

Lorsque je tente ce que je reçois ce ERROR- messages: Mauvais tableau ou nom de colonne: '(sélectionnez MAX (id) FROM test)' a des caractères non alphanumériques ou underscore! dans /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm ligne 2893. DBD :: CSV :: db prepare a échoué: Nom incorrect de la table ou de la colonne: '(sélectionnez MAX (id) FROM test)' a des caractères non alphanumériques ou underscore! à l'adresse /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm ligne 2894. [pour instruction "SELECT * FROM test WHERE id = (sélectionnez MAX (id) FROM test)"] à la ligne ./so_3.pl 32. –

+0

@sid_com - Alors exécutez d'abord - sélectionnez MAX (id) FROM $ table - put le résultat dans une variable (par exemple, $ max_id) et exécutez la seconde requête: SELECT * FROM $ table WHERE id = $ max_id – msi77

+0

Cela signifie-t-il que "Sélectionnez MAX (id) FROM $ table WHERE id = $ max_id" est OK ? Concerne le "# valide uniquement pour l'analyse (ne fonctionnera pas à partir d'un DBD) - SELECT MyFunc (args) FROM x WHERE y;" seulement des fonctions définies par l'utilisateur? –

0

J'ai vu quelque chose de similaire à cela se produire aujourd'hui. Je trouve que si je l'ai fait:

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

directement avant la requête qui a utilisé une UDF ou une fonction, l'erreur est allé loin ... Je suis allé avec elle :)

Questions connexes