1. ホーム
  2. sql

[解決済み] オラクルシーケンスをインクリメントせずに現在値を取得する方法は?

2022-03-10 10:33:13

質問

シーケンスの値をインクリメントせずに取得するSQL命令はありますか?

ありがとうございます。

編集・結語

Justin Cave氏が述べているように、シーケンス番号の保存は有用ではありません。

select a_seq.nextval from dual;

は、シーケンス値をチェックするには十分です。

私は、オリーの回答が最初の質問に答えているので、まだ良い方だと思います。しかし、シーケンスを変更しない必要性について自問してみてください。

どのように解決するのですか?

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

からは、様々なシーケンスのメタデータを取得することができます。 user_sequences , all_sequencesdba_sequences .

これらのビューはセッションをまたいで機能します。

EDITです。

もし、そのシーケンスがデフォルトスキーマにあるならば。

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

その時、すべてのメタデータが欲しいのであれば。

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

お役に立てれば幸いです...。

EDIT2です。

キャッシュサイズが1でない場合、より確実に行うための長ったらしい方法としては、以下のようなものがあります。

SELECT increment_by I
  FROM user_sequences
 WHERE sequence_name = 'SEQ';

      I
-------
      1

SELECT seq.nextval S
  FROM dual;

      S
-------
   1234

-- Set the sequence to decrement by 
-- the same as its original increment
ALTER SEQUENCE seq 
INCREMENT BY -1;

Sequence altered.

SELECT seq.nextval S
  FROM dual;

      S
-------
   1233

-- Reset the sequence to its original increment
ALTER SEQUENCE seq 
INCREMENT BY 1;

Sequence altered.

ただ、この間に他の人がシークエンスを使用していると、その人(またはあなた)に

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

また、キャッシュを NOCACHE をリセットする前に、そしてリセット後に元の値に戻して、多くの値をキャッシュしていないことを確認します。