Ben*_*oit 5 oracle plsql pipelined-function
在下面的示例中,我将始终获得"1,2",或者是否可以获得"2,1"并且您能告诉我您在文档中的哪个位置可以保证它是否存在?
如果答案是肯定的,那就意味着没有ORDER BY也ORDER 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)
谢谢.
我认为文档中没有任何地方可以保证数据的返回顺序.
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)
| 归档时间: |
|
| 查看次数: |
19623 次 |
| 最近记录: |