2010-05-09 7 views
1

De la SQL :: Déclaration :: documentation Fonctions:DBD :: CSV: Problème avec les fonctions définis par l'utilisateur

Création de fonctions définies par l'utilisateur
...
fonctions plus complexes peuvent utiliser un certain nombre des arguments toujours passés aux fonctions automatiquement. Les fonctions reçoivent toujours ces valeurs dans @_:
sub FOO {my ($ self, $ sth, $ rowhash, @params); }

#!/usr/bin/env perl 
use 5.012; 
use warnings; use strict; 
use DBI; 

my $dbh = DBI->connect("DBI:CSV:", undef, undef, { RaiseError => 1, }); 
my $table = 'wages'; 
my $array_ref = [ [ 'id', 'number' ], 
      [ 0, 6900 ], 
      [ 1, 3200 ], 
      [ 2, 1800 ], ]; 

$dbh->do("CREATE TEMP TABLE $table AS import(?)", {}, $array_ref); 

sub routine { 
    my $self = shift; 
    my $sth = shift; 
    my $rowhash = shift; # 
    return $_[0]/30; 
}; 

$dbh->do("CREATE FUNCTION routine"); 
my $sth = $dbh->prepare("SELECT id, routine(number) AS result FROM $table"); 
$sth->execute(); 
$sth->dump_results(); 

Lorsque je tente ce je reçois un message d'erreur:

DBD :: CSV :: st execute a échoué: utilisation de la valeur non initialisée $ _ [0] dans la division (/) à la ligne de 27. ./so.pl
[pour déclaration "SELECT id, routine (nombre) AS résultent de "salaires""] à la ligne ./so.pl 34.

Quand je en commentaire le troisième argument que je travaille comme prévu (parce qu'il semble comme si le troisième argument est absent):

#!/usr/bin/env perl 
... 
sub routine { 
    my $self = shift; 
    my $sth = shift; 
    #my $rowhash = shift; 
    return $_[0]/30; 
}; 
... 

0, 230
1, 106,667
2, 60
3 rangées

Est-ce un bug?

Répondre

3

également de la documentation SQL::Statement::Functions:

Lorsque vous utilisez SQL :: Déclaration/SQL :: Parser directement à Parse SQL, fonctions (soit intégré ou défini par l'utilisateur) peut se produire partout dans une instruction SQL, des valeurs , des noms de colonne, des noms de table ou des prédicats peuvent se produire. Lorsque vous utilisez les modules par un DBD ou dans tout autre contexte dans lequel le SQL est à la fois analysées et exécutées, les fonctions peuvent se produire dans les mêmes lieux, sauf qu'ils ne peuvent pas se produire dans la colonne clause de sélection d'un SELECT instruction qui contient une clause FROM.

à savoir

SELECT id, routine(number) AS result FROM wages 

ne fonctionnera pas.

Ressaisissez votre fonction pour retourner une table, quelque chose comme ceci:

sub routine { 
    my($self,$sth,$rowhash,@params) = @_; 
    return [ [qw(id result)], 
      map { [ $_->[0], $_->[1]/30 ] } @$array_ref ]; 
}; 

$dbh->do("CREATE FUNCTION routine"); 
my $sth = $dbh->prepare("SELECT * FROM routine()"); 
$sth->execute(); 
$sth->dump_results(); 

Avec les résultats attendus:

$ perl dl.pl 
0, 230 
1, 106.667 
2, 60 
3 rows 
+0

Vous pouvez également essayer tel quel, sans utiliser rowhash de $, mais que sems comme s'appuyer sur sans-papiers et susceptibles de changer de comportement. Le bug n'est pas que votre fonction ne fonctionne pas correctement, c'est que cela fonctionne du tout, en fonction de la documentation. – MkV

+0

Si mon interprétation de cette partie du document est correcte, il en va de même pour la fonction intégrée - c'est dommage. –

Questions connexes