The table-generated-by-PL/SQL approach is faster because it transforms the IN into a pseudo-join of the form used if you say "WHERE foo IN (SELECT bar FROM fubar)".
The "WHERE foo IN (list of literals)" approach is transformed into a bunch of OR expressions - which are always slow as hell in SQL implementations.
Um, Don, then my obvious question is, why doesn't Oracle transform the
"where foo in (...)" syntax into a pseudo-join as well, rather than
lots of or expressions? And are PostgreSQL or other RDBMSs any
smarter about that?