やりたいこと
シーケンスを必要な数だけ連番で発番したい。
(任意の数だけ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の直積結合は大量のサンプルデータを作成する時とかにも便利なので、意外と使いどころは多いです。