SELECT*FROM TABLE(流水线函数):我可以确定结果中行的顺序吗?

Ben*_*oit 5 oracle plsql pipelined-function

在下面的示例中,我将始终获得"1,2",或者是否可以获得"2,1"并且您能告诉我您在文档中的哪个位置可以保证它是否存在?

如果答案是肯定的,那就意味着没有ORDER BYORDER SIBLINGS没有办法确定SELECT语句中的结果集顺序.

CREATE TYPE temp_row IS OBJECT(x number);
/

CREATE TYPE temp_table IS TABLE OF temp_row;
/

CREATE FUNCTION temp_func
RETURN temp_table PIPELINED
IS
BEGIN
    PIPE ROW(temp_row(1));
    PIPE ROW(temp_row(2));
END;
/

SELECT * FROM table(temp_func());
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ben*_*Ben 5

我认为文档中没有任何地方可以保证数据的返回顺序.

2003年有一个旧的Tom Kyte线程(因此可能已经过时),它表明依赖隐式顺序是不可取的,原因与您不依赖普通SQL中的顺序相同.

1st:是从SQL语句中的表函数返回的行的顺序与条目被"管道"到内部集合的完全相同的顺序(因此不需要order by子句)?

...

跟进2003年5月18日 - 上午10点UTC:

1)也许,也许不是,我不会指望它.如果没有顺序,您不应该依赖结果集中的行顺序.如果您加入或执行更复杂的操作,那么只需"从表中选择*(f(x))",行就可以以其他顺序返回.

凭经验 - 他们似乎回来了,因为他们用管道输送.我不相信记录是这样的.

实际上,NESTED TABLE类型的集合被记录为显然 不具有保留顺序的能力.

为了安全起见,如果要对查询结果进行排序,则应该像查询中一样,按照显式ORDER BY进行操作.

说过我已经完成了你的功能并运行了1000万次迭代,以检查隐式顺序是否曾被破坏; 事实并非如此.

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.
Run Code Online (Sandbox Code Playgroud)