Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SELECT * FROM TABLE (pipelined function):Kann ich mir der Reihenfolge der Zeilen im Ergebnis sicher sein?

Ich glaube nicht, dass es irgendwo in der Dokumentation Garantien gibt die Reihenfolge, in der die Daten zurückgegeben werden.

Es gibt einen alten Tom Kyte-Thread von 2003 (also könnte veraltet sein), was besagt, dass es nicht ratsam wäre, sich auf die implizite Reihenfolge zu verlassen, aus den gleichen Gründen, aus denen Sie sich nicht auf die Reihenfolge in gewöhnlichem SQL verlassen würden.

Sicherheitshalber sollten Sie wie immer in einer Abfrage ein explizites ORDER BY angeben, wenn Sie die Abfrageergebnisse sortiert haben möchten.

Allerdings habe ich Ihre Funktion genommen und 10 Millionen Iterationen ausgeführt, um zu überprüfen, ob die implizite Reihenfolge jemals gebrochen wurde. das war es nicht.

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.