0

特定の行のレコードを選択する手順を 1 つ作成する必要があります

例えば

procedure test1
(
start_ind number,
end_ind number,
p_out ref cursor
)

begin
opecn p_out for
select * from test where rownum between start_ind and end_ind;
end;

start_ind 1 と end_ind 10 を渡すと動作しますが、start_ind を 5 に変更すると

クエリは次のようになります

select * from test where rownum between 5 and 10;

失敗し、出力が表示されません。

この問題を解決する方法を教えてください。ありがとうございます!

4

3 に答える 3

2

rownum が割り当てられてから、where 条件が評価されます。結果セットに行番号 1 ~ 4 が含まれることはないため、行番号 5 に到達することはありません。次のようなものが必要です。

SELECT * FROM ( 
    SELECT rownum AS rn, t.* 
      FROM (
        SELECT t.*
          FROM test t
         ORDER BY t.whatever
      )
     WHERE ROWNUM <= 10
)
WHERE rn >= 5

また、内側の選択に order by 句が必要になるか、取得する行が未定義になります。

Tom Kyte によるこの記事では、知っておく必要があるすべてのことを説明しています

于 2013-10-27T16:19:03.543 に答える
1
SELECT *
  from (SELECT rownum AS rn, t.*
          FROM MyTable t
         WHERE ROWNUM <= 10
        ORDER BY t.NOT-Whatever 
       -- (its highly important to use primary or unique key of MyTable)        
 WHERE rn > 5

ヒントとして、:
通常store-procedures、データの検証、アクセス制御、複数の SQL ステートメントの実行を必要とする大規模または複雑な処理に使用します。ストアド プロシージャは結果セット、つまり SELECT ステートメントの結果を返す場合があります。このような結果セットは、カーソル、他のストアド プロシージャ、結果セット ロケーターの関連付け、またはアプリケーションを使用して処理できます。

ruw-number を使用して、ページ化されたクエリをフェッチすると思います。上記の考え方に基づい
て を作成してみてください。generic select query

于 2013-10-29T08:49:31.040 に答える