182

インクリメントしないシーケンスの値を取得する SQL 命令はありますか。

ありがとう。

編集と結論

Justin Caveが述べたように、シーケンス番号を「保存」しようとするのは役に立たないので、

select a_seq.nextval from dual;

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

最初の質問に答えたので、私はまだOllieの答えを良いものとして保持しています. ただし、シーケンスを変更したい場合は、シーケンスを変更しない必要があるかどうかを自問してください。

4

7 に答える 7

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

user_sequencesall_sequencesおよびからさまざまなシーケンス メタデータを取得できますdba_sequences

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

編集:

シーケンスがデフォルトのスキーマにある場合:

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リセットする前にキャッシュを に設定し、後で元の値に戻して、多くの値をキャッシュしていないことを確認することもできます。

于 2012-04-18T13:22:39.687 に答える
138

select MY_SEQ_NAME.currval from DUAL;

select MY_SEQ_NAME.nextval from DUAL;現在のセッションで実行した場合にのみ機能することに注意してください。

于 2012-04-18T13:23:12.057 に答える