증가하지 않는 시퀀스 값을 검색하는 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 …은 시퀀스가 해당 테이블에 연결되어 있다고 가정하면 간단하고 빠르고 좋은 솔루션입니다.