I think you're drawing the wrong conclusions from this...
The point is there is
no guarantee that rownum = column_value.
Here's another example where they don't match:
create or replace type number_tabtyp as table of number;
/
create or replace function manyrows
return number_tabtyp authid definer
pipelined
is
begin
for i in reverse 1..10 loop
pipe row ( i ) ;
end loop;
return ;
end manyrows;
/
select rownum, column_value from table(manyrows);
ROWNUM COLUMN_VALUE
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
That's three simple examples where
rownum <> column_value. It's likely there are many more.
I would
not write code based on the assumption that they are the same.