You are correct about union all not using a sort when it is processed.

Does Oracle have an equivalent to the SQL Server table data type? If so, you can use a variable of data type table as if it was an actual table, but it's actually faster because the table is in memory and not written to the disk.