Не мисля, че има някъде в документацията, която гарантира реда, в който данните ще бъдат върнати.
Има един стар Тема на Tom Kyte от 2003 г. (така че може да е остаряла), която гласи, че разчитането на имплицитния ред не би било препоръчително поради същите причини, по които не бихте разчитали на реда в обикновен SQL.
1-во: редът на редовете, върнати от функцията на таблицата в рамките на SQL оператор, същият ли е редът, в който записите са били "предадени" във вътрешната колекция (така че не е необходим ред по клауза)?
...
Продължение 18 май 2003 г. - 10 сутринта UTC:
1) може би, може би не, не бих разчитал на това. Не трябва да разчитате на реда на редовете в набор от резултати, без да имате ред по. Ако се присъедините или направите нещо по-сложно, тогава просто "изберете * от таблица( f(x))", редовете може да се върнат в друг ред.
емпирично - изглежда, че се връщат, когато бъдат предадени. Не вярвам да е документирано, че това е така.
Всъщност колекциите от тип NESTED TABLE са документирани, че изрично нямат способността да запазват реда.
За да сте сигурни, трябва да направите както винаги в заявка, да посочите изрично ORDER BY, ако искате резултатите от заявката да са подредени.
След като казах, че взех вашата функция и изпълних 10 милиона итерации, за да проверя дали имплицитният ред някога е бил нарушен; не беше.
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.
person
Ben
schedule
23.05.2013