貧乏暇だらけ

筋トレとサプリのブログ

【Oracle】シーケンスを任意の数だけ進めて複数の連番を取得する(欠番を作る)

やりたいこと

シーケンスを必要な数だけ連番で発番したい。

(任意の数だけNEXTVALして、かつNEXTVALで発番された全ての値を取得したい)

サンプル

SELECT

  SAMPLE_SEQ.NEXTVAL

FROM

  (SELECT 0 FROM ALL_CATALOG WHERE ROWNUM <= 3);

結果

NEXTVAL

----------

          1

          2

          3

もう一度実行すると

NEXTVAL

----------

          4

          5

          6

解説

ROWNUM <= 3の部分で取得したい個数を指定しています。

ROWNUM <= 100 にすれば100個の数が取得できます。

ALL_CATALOGというビューを行数の取得に使用していますが、これは現在のユーザがアクセス可能な全ての表、クラスタ、ビュー、シノニム、順序が参照できるビューです。

つまり環境によってALL_CATALOGの行数は異なるのですが、通常は数千行は得られるので、 「どの環境にも絶対に存在していて、かつ行数が多いもの」としてALL_CATALOGを使用しています。

ALL_CATALOGでは行数が足りない時

上記のクエリで取得できる最大の個数は、ALL_CATALOGの行数です

SELECT COUNT(*) FROM ALL_CATALOG;

それ以上の数のシーケンスを発番したい時には、ALL_CATALOG同士を直積結合させると良いです。

SELECT

  SAMPLE_SEQ.NEXTVAL

FROM

  (SELECT 0 FROM ALL_CATALOG WHERE ROWNUM <= 5000),(SELECT 0 FROM ALL_CATALOG WHERE ROWNUM <= 5000);

※この例では25,000,000行が発番される

※直積結合は処理コストが膨大なので、数万件ならUNION ALLにしましょう

あとがき

ALL_CATALOGの直積結合は大量のサンプルデータを作成する時とかにも便利なので、意外と使いどころは多いです。