sub late_bound_sql { my $string = join ('',@_); # collate args into SQL statement. my $late_bound_fields = m/ \? /g; # Count late bound fields. my $sql = $dbh->prepare($string); # Create sql template. return sub { return 0 if $#_ != $late_bound_fields; # bad param count. for (0..$#_) { # For each argument, assume in sequence. $sql->bind_param($_, $_[$_]); # Apply bind param. } if ($sql->execute()) { # Do _this_ sql. return 1; } else { return 0; } } } # Create closures. $lb1 = late_bound("INSERT INTO foo VALUES ( x = ?, y = ?) "); $lb2 = late_bound("INSERT INTO bar, VALUES (a = ?, b = NULL)"); # Use them. &$lb1(2,4); # Inserts x= 2, y= 4 to table foo. &$lb2("cuttlefish"); # Inserts a= cuttlefish, b= NULL to table bar