Andrew, it's on page 893 of Tom Kyte's book.
When I tested the temporary table I did the same thing you mention - looped through the array and inserted each value (although I did use a bind variable to do it :). I found that I had to create my temporary table to preserve rows instead of deleting them, because when the table was created to automatically delete rows they were gone when I went to select them. So I had the additional overhead of deleting them afterwards.