my @columns = qw(DD address ); # and the other columns, omitted for brevity my @payload = @{ $data }{ @columns }; my $placeholders = join ",", ('?' x @columns); my $columns_str = join ",", @columns; my $sql = "insert into mytable ($columns_str) values ($placeholders);"; my $sth = $dbh->prepare( $sql ); $sth->execute( @payload ); # this assumes you use RaiseError => 1, which you always should