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


156

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

감사.

편집 및 결론

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

select a_seq.nextval from dual;

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

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


5
왜? 해결하려는 문제는 무엇입니까? 시퀀스를 올바르게 사용하는 경우 다른 세션에 할당 된 시퀀스 값이나 후속 세션에 할당 될 수있는 값은 신경 쓰지 않아야합니다.
저스틴 동굴

3
데이터 마이그레이션 후 마이그레이션 된 데이터에 따라 시퀀스가 ​​올바르게 업데이트되었는지 확인합니다
frno

3
그렇다면 단순히 nextval시퀀스를 테스트하여 얻는 단점은 무엇 입니까? 시퀀스에 공백이 없다고 가정하지 않습니까? 따라서 시퀀스 값을 "폐기"하는 것은 문제가되지 않습니다.
저스틴 동굴

나는 당신이 옳았다 고 생각한다. 나는 그 점검을 위해 db의 상태를 바꾸고 싶지 않았지만 솔직히 말해서 이유를 모른다. 통찰력 주셔서 감사합니다. 그럼에도 불구하고 나는 시퀀스에 대해 당신의 것들을 배웠습니다, 모두 감사합니다!
frno

시퀀스의 값을 안정적으로 얻을 수 있다고 가정하면 오라클이 시퀀스가 ​​올바르게 업데이트되었는지 확인하는 것은 무엇입니까?
Shannon Severance

답변:


173
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재설정 하기 전에 캐시를 설정 한 다음 나중에 원래 값으로 되돌려 많은 값을 캐시하지 않도록 할 수 있습니다.


방금 시도했지만 'all_sequences'테이블에 액세스 할 수 없습니다. 관리자 자격 증명으로 만 볼 수있는 특별한 개체입니까?
frno

1
ALL_SEQUENCES보기입니다. 액세스 권한이 없으면 USER_SEQUENCES시퀀스가 기본 스키마에 있는지 선택 하십시오. (에 대한 sequence_owner = '<sequence_owner>'조항이 필요하지 않습니다 USER_SEQUENCES).
Ollie

15
LAST_NUMBER에는 ALL_SEQUENCES세션이 실제로 주어졌다과에 호출에서 반환 될 수 없을 것이라는 점을 마지막 숫자되지 않습니다 sequence_name.nextval일반적으로. 시퀀스를 CACHE1 이상 (기본값은 20)으로 설정했다고 가정하면 LAST_NUMBER캐시에있는 마지막 숫자가됩니다. 이 숫자가 실제로 모든 세션에 제공 될 것이라는 보장은 없습니다.
저스틴 동굴

2
ALTER SEQUENCE seq INCREMENT BY -1;다른 세션이 호출되지 않는다고 보장 할 수 없으면 문제 가됩니다 seq.nextval. 그렇지 않으면 시퀀스는 중복 값을 전달하는데, 이는 일반적으로 원하는 값이 아닙니다.
Shannon Severance

1
OP는 "데이터 마이그레이션 후 점검"이라고 말 했으므로 DB가 일반적으로 사용되지 않는다고 가정하는 것은 그리 어렵지 않지만 그렇지 않은 경우 문제가 될 수 있습니다.
Ollie

122

select MY_SEQ_NAME.currval from DUAL;

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


1
답변 주셔서 감사합니다. Boomi에서 이것을 사용해야하고 위아래로 해결책을 찾고있었습니다
학습 ...

0

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

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

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


0

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

왜 그것을 원하십니까?

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

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

RonK의 쿼리 :

select MY_SEQ_NAME.currval from DUAL;

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


0

또한 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 ...은 시퀀스가 ​​해당 테이블에 연결되어 있다고 가정하면 간단하고 빠르고 좋은 솔루션입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.