use strict; use warnings; use DBI; my @date = qw(year month day hour minute); my @items = qw(burgers fries sodas); my @fields = (@date, @items); my @entries = ( makeEntry( 'day' => 1, 'month' => 1, 'year' => 2000, 'hour' => 4, 'minute' => 44, 'burgers' => 5, 'fries' => 3, 'sodas' => 11 ), makeEntry( 'day' => 1, 'month' => 1, 'year' => 2000, 'hour' => 4, 'minute' => 45, 'burgers' => 2, 'fries' => 4, 'sodas' => 7 ), ); unlink 'delme.sqlite'; my $dbh = DBI->connect("dbi:SQLite:dbname=delme.sqlite","",""); my $sql = <do ($sql); my $columns = join ', ', @fields; my $places = join ', ', ('?') x @fields; my $sth = $dbh->prepare ("Insert INTO Sales ($columns) VALUES ($places)"); $sth->execute(@$_) for @entries; $sth = $dbh->prepare("select * from Sales order by Year, Month, Day, Hour, Minute"); $sth->execute(); while (my $row = $sth->fetchrow_hashref()) { printf "%04d/%02d/%02d %02d:%02d:00\n", @{$row}{@date}; printf " %-7s %s\n", $_, $row->{"${_}"} for @items; } sub makeEntry { my %row = @_; return [@row{@fields}]; }