Thanks for the responses!
Note in the code that I print out the entire query before it gets passed into the dbh->prepare. This is the query I cut and pasted into sqlplus just for accuracy.
All interpolation is done correctly it looks like. The $retcode should be accurate...there is no point in replacing the WTF because that is never printed. The execute works, and the die never occurs. It simply think there are no rows to return. In sqlplus, over 1200 are returned.
The $l resolves to two capital letters in the final run, printed just before the prepare statement. I tried messing with all that.