6

次の例では、私は常に「1, 2」を取得しますか?それとも「2, 1」を取得することは可能ですか?ドキュメントのどこに記載されているか教えてください。

答えが「はい」の場合は、SELECT ステートメントで結果セットの順序を確認する方法がORDER BYないことを意味します。ORDER SIBLINGS

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());

ありがとうございました。

4

3 に答える 3

5

データが返される順序を保証するドキュメントのどこにもないと思います。

2003 年からの古いTom Kyte スレッド(古いものである可能性があります) があり、通常の SQL で順序に依存しないのと同じ理由で、暗黙の順序に依存することはお勧めできません。

1つ目:SQLステートメント内のテーブル関数から返される行の順序は、エントリが内部コレクションに「パイプ」された順序とまったく同じですか(order by句は必要ありません)?

...

フォローアップ 2003 年 5 月 18 日 - 午前 10 時 (UTC):

1) たぶん、そうではないかもしれません。order by がなければ、結果セット内の行の順序を当てにしないでください。結合するか、より複雑なことを行う場合は、単純に「select * from table( 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.
于 2013-05-23T12:15:33.350 に答える