2017/12/07
ORACLEのシーケンス(順序)ですが、現在どこまで採番されているのか、次に採番される値は何か、ということを確認したい時があるかと思います。
本記事では、シーケンスの現在値または次に採番される値の確認方法を紹介します。
sponsored link
現在値の正確な把握は困難
紹介すると最初に書きましたが、実はシーケンス(順序)の現在値の正確な把握は困難です。
本記事では、3つの方法を紹介しますが、大体の値の取得しかできないなど、それぞれ制限があります。
シーケンスの現在値の取得方法
静的データディクショナリビューを参照
1つ目は、静的データディクショナリビューのUSER_SEQUENCES(もしくは、ALL_SEQUENCESやDBA_SEQUENCES)でLAST_NUMBER項目を参照する方法です。
注意点としては、共有プールへのキャッシュを有効にしている場合、実際には生成されていない場合であっても、すでに共有プールへキャッシュされた値まで含めてしまう点です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
-- (キャッシュ2/増分値1/初期値1) SELECT SEQUENCE_NAME,LAST_NUMBER FROM USER_SEQUENCES; SEQUENCE_NAME LAST_NUMBER -------------- ----------- TEST_SEQ1 1 SELECT test_seq1.NEXTVAL a FROM DUAL; A ----- 1 SELECT SEQUENCE_NAME,LAST_NUMBER FROM USER_SEQUENCES; SEQUENCE_NAME LAST_NUMBER -------------- ----------- TEST_SEQ1 3 SELECT test_seq1.NEXTVAL a FROM DUAL; A ----- 2 SELECT SEQUENCE_NAME,LAST_NUMBER FROM USER_SEQUENCES; SEQUENCE_NAME LAST_NUMBER -------------- ----------- TEST_SEQ1 3 SELECT test_seq1.NEXTVAL a FROM DUAL; A ----- 3 SELECT SEQUENCE_NAME,LAST_NUMBER FROM USER_SEQUENCES; SEQUENCE_NAME LAST_NUMBER -------------- ----------- TEST_SEQ1 5 |
シーケンス名.CURRVAL
2つ目は、【シーケンス名.CURRVAL】を使用することで、セッション内で直前に生成された値の確認できます。
注意する点は、あくまでもセッション内という点です。他のセッションでの生成が時系列的に後であっても、セッション内で直前に生成された値しか確認できません。
1 2 3 4 5 6 7 8 9 |
SELECT test_seq1.NEXTVAL a FROM DUAL; A ----- 1 SELECT test_seq1.CURRVAL a FROM DUAL; A ----- 1 |
また、セッション内で一度も生成していない場合は、エラー(ORA-08002)になります。
1 2 3 4 |
SELECT test_seq1.CURRVAL a FROM DUAL; ORA-08002: 順序XXXXX.CURRVALはこのセッションではまだ定義されていません ※XXXXXには、シーケンス名が入ります。 |
シーケンス名.NEXTVAL
3つ目は、【シーケンス名.NEXTVAL】を使用して、実際に値の生成とシーケンスのカウントアップをすることで現在値を確認する方法です。
確実な方法ですが、実際に値の生成とカウントアップをしてしまうので、シーケンスを利用しているデータに、値の歯抜けができてしまう欠点があります。
まとめ
ORACLEのシーケンス(順序)の現在値または次に採番される値の確認方法を見てきました。
意外と、シーケンスに影響を与えずに正確に値を把握するのは困難です。
しかし、実際には大体の把握で十分な場合が多いと思います。その場合は、静的データディクショナリビュー(USER_SEQUENCESなど)の参照をするのがよいでしょう。
関連