Non credo che ci sia da nessuna parte nella documentazione che garantisce l'ordine in cui verranno restituiti i dati.
Esiste un vecchio Filo di Tom Kyte dal 2003 (quindi potrebbe essere obsoleto) che afferma che non sarebbe consigliabile fare affidamento sull'ordine implicito, per gli stessi motivi per cui non faresti affidamento sull'ordine in SQL ordinario.
Per sicurezza, dovresti fare come sempre in una query, dichiarare un ORDER BY esplicito, se vuoi che i risultati della query siano ordinati.
Detto questo, ho preso la tua funzione ed eseguito 10 milioni di iterazioni, per verificare se l'ordine implicito è mai stato interrotto; non lo era.
SQL> begin
2 for i in 1 .. 10000000 loop
3 for j in ( SELECT a.*, rownum as rnum FROM table(temp_func()) a ) loop
4
5 if j.x <> j.rnum then
6 raise_application_error(-20000,'It broke');
7 end if;
8 end loop;
9 end loop;
10 end;
11 /
PL/SQL procedure successfully completed.