[sql] 오라클 시퀀스의 현재 값을 증가시키지 않고 검색하는 방법은 무엇입니까?

증가하지 않는 시퀀스 값을 검색하는 SQL 명령이 있습니까?

감사.

편집 및 결론

Justin Cave가 말했듯이 시퀀스 번호를 “저장”하는 것은 유용하지 않으므로

select a_seq.nextval from dual;

시퀀스 값을 확인하기에 충분합니다.

Ollie는 여전히 초기 질문에 답변했기 때문에 Ollie를 좋은 답변으로 유지합니다. 원하는 경우 시퀀스를 수정하지 않아도되는 필요성에 대해 스스로에게 물어보십시오.



답변

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

당신의 순서 다양한 메타 데이터를 얻을 수 있습니다 user_sequences, all_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재설정 하기 전에 캐시를 설정 한 다음 나중에 원래 값으로 되돌려 많은 값을 캐시하지 않도록 할 수 있습니다.


답변

select MY_SEQ_NAME.currval from DUAL;

select MY_SEQ_NAME.nextval from DUAL;현재 세션에서 실행 한 경우에만 작동 합니다.


답변

원래의 답변이 사실 틀 렸으며 삭제 된 것을 기쁘게 생각합니다. 아래 코드는 다음과 같은 조건에서 작동합니다. 필자의 경우 값을 수정하는 절차를 호출하는 것과 비슷한 문제가 발생했으며 가정이 사실이라고 확신합니다.

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

안타깝게도 세션에서 시퀀스를 수정하지 않은 경우 NEXTVAL이 유일한 방법이라고 다른 사람들이 옳다고 생각합니다.


답변

이것은 실제로 답변이 아니며 질문이 잠겨 있지 않은 경우 주석으로 입력했을 것입니다. 이것은 질문에 대한 답변입니다.

왜 그것을 원하십니까?

기본 키로 시퀀스가있는 테이블이 있고 시퀀스가 ​​삽입 트리거에 의해 생성되었다고 가정하십시오. 이후의 레코드 업데이트에 시퀀스를 사용할 수있게하려면 해당 값을 추출 할 수있는 방법이 필요합니다.

올바른 것을 얻기 위해 INSERT 및 RonK의 쿼리를 트랜잭션에 래핑 할 수 있습니다.

RonK의 쿼리 :

select MY_SEQ_NAME.currval from DUAL;

위 시나리오에서 삽입 및 업데이트가 동일한 세션에서 발생하므로 RonK의 경고는 적용되지 않습니다.


답변

또한 CURRVAL을 사용하여 일부 프로세스가 해당 시퀀스를 기본 키로 사용하여 일부 테이블에 새 행을 삽입했는지 확인했습니다. CURRVAL이 가장 빠른 방법이라고 가정했습니다. 그러나 a) CurrVal은 작동하지 않습니다. 자신의 세션에서 NEXTVAL을 수행 할 때까지 다른 Oracle 세션에 있기 때문에 이전 값을 얻습니다. 그리고 b) a select max(PK) from TheTable도 매우 빠릅니다. 아마도 PK가 항상 색인화되어 있기 때문일 것입니다. 또는 select count(*) from TheTable. 나는 여전히 실험 중이지만 두 SELECT 모두 빠르다.

나는 순서의 차이를 신경 쓰지 않지만, 내 경우에는 많이 폴링을 생각하고 있었고, 매우 큰 차이에 대한 아이디어를 싫어할 것입니다. 특히 간단한 SELECT가 빠르면 더욱 그렇습니다.

결론:

  • CURRVAL은 다른 세션에서 NEXTVAL을 감지하지 못하므로 이전 NEXTVAL에서 이미 알고있는 것만 반환하므로 꽤 쓸모가 없습니다.
  • SELECT MAX (…) FROM …은 시퀀스가 ​​해당 테이블에 연결되어 있다고 가정하면 간단하고 빠르고 좋은 솔루션입니다.

답변