Of course, if you actually want to abstract away your SQL rather than just inlining it, then you can use Tangram for that;
my $r_cd = $storage->remote("Music::CD");
my @cds = $storage->select
( filter =>
( ( $r_cd->{artist} eq "Ozzy Osbourne" )
& ( $r_cd->{title}->like("%Crazy") )
& ( $r_cd->{year} <= 1986 ) ),
order => $r_cd->{year},
limit => [2, 3]
);
This has great advantages in that query filters can be passed around as objects and hence built dynamically, including arbitrary joins.
See the Music Store demo in the Tangram distribution for more examples, including many queries not easily written with Class::DBI.
$h=$ENV{HOME};my@q=split/\n\n/,`cat $h/.quotes`;$s="$h/."
."signature";$t=`cat $s`;print$t,"\n",$q[rand($#q)],"\n";