programing

오라클 시퀀스의 현재 값을 증가시키지 않고 취득하려면 어떻게 해야 합니까?

nicescript 2023. 4. 2. 13:45
반응형

오라클 시퀀스의 현재 값을 증가시키지 않고 취득하려면 어떻게 해야 합니까?

증분하지 않는 시퀀스의 값을 가져오는 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_sequences그리고.dba_sequences.

이러한 뷰는 세션 전체에서 작동합니다.

편집:

시퀀스가 기본 스키마에 있는 경우:

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

모든 메타데이터를 원하는 경우:

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

편집 2:

캐시 크기가 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 field_SQ.nextval from dual;  -- it will increase the value by 1 for each run
select field_SQ.currval from DUAL;

다만, 다음의 경우는, 순서를 예상대로 변경할 수 있습니다.1정수(음수 또는 양수)일 수 있습니다.

alter sequence field_SQ increment by 1 minvalue 0

이것은 답이 아닙니다.정말이지 질문이 잠겨있지 않았다면 댓글로 입력했을 것입니다.이 질문에 대한 답변은 다음과 같습니다.

왜 그걸 원하죠?

시퀀스를 프라이머리 키로 하는 테이블이 있고 삽입 트리거에 의해 시퀀스가 생성된다고 가정합니다.레코드의 후속 업데이트에서 시퀀스를 사용할 수 있도록 하려면 해당 값을 추출하는 방법이 필요합니다.

올바른 쿼리를 얻으려면 INSERT 및 RonK의 쿼리를 트랜잭션으로 래핑할 수 있습니다.

RonK의 질문:

select MY_SEQ_NAME.currval from DUAL;

위의 시나리오에서는 삽입과 갱신이 같은 세션에서 이루어지기 때문에 RonK의 경고는 적용되지 않습니다.

또한 CURRVAL을 사용하여 일부 프로세스가 해당 시퀀스를 프라이머리 키로 하는 테이블에 새 행을 삽입했는지 알아보려고 했습니다.내 추측으로는 CURRVAL이 가장 빠른 방법이었다.a) CurrVal은 동작하지 않습니다.다른 Oracle 세션에 있기 때문에 자신의 세션에서 NEXTVAL을 실행할 때까지 오래된 값만 가져옵니다.그리고 b) aselect max(PK) from TheTable또한 PK가 항상 인덱싱되기 때문에 매우 빠릅니다. ★★★select count(*) from TheTable'SELECT'는 'SELECT'를 선택합니다.

저는 연속된 간격에 개의치 않습니다만, 제 경우는 많은 투표를 생각하고 있었습니다. 그리고 매우 큰 간격은 싫습니다.특히 심플한 SELECT도 같은 속도를 낼 수 있다면요.

결론:

  • CURRVAL은 다른 세션에서 NEXTVAL을 검출하지 않고 이전 NEXTVAL에서 이미 알고 있던 것만 반환하기 때문에 매우 쓸모가 없습니다.
  • SELECT MAX(...) FROM ...은 우수한 솔루션입니다.시퀀스가 이 테이블에 링크되어 있다고 가정할 때 심플하고 빠릅니다.

, 삽입 를 취득하려고 을 수행하기 위해 이 되는 하지 않고 언급한 쿼리를 . 이를 위해 기본 데이터 액세스 라이브러리 사전 설정 함수에 의존하지 않습니다.다른 사용자가 언급한 것처럼 SQL 쿼리를 작성해야 합니다.SEQ_MY_NAME.NEXTVAL 키는 스테이트먼트 「(는)」를 .SELECT SEQ_MY_NAME.CURRVAL FROM dual백엔드에서.

CURRVAL은 NEXTVAL이 사전에 호출된 경우에만 호출할 수 있습니다.이것은 모두 위의 전략에서 자연스럽게 실행됩니다.

원래 답장이 틀렸는데 삭제해서 다행이에요.다음 코드는 a) 다른 누구도 시퀀스를 수정하지 않았다는 것을 알고 있습니다.b) 세션에 의해 시퀀스가 수정되었습니다.제 경우 값을 수정하는 프로시저를 호출하다가 비슷한 문제가 발생했는데, 이 가정이 사실이라고 확신하고 있습니다.

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

안타깝게도 세션에서 순서를 수정하지 않았다면 NEXTVAL이 유일한 방법이라는 다른 사람들의 말이 옳다고 생각합니다.

언급URL : https://stackoverflow.com/questions/10210273/how-to-retrieve-the-current-value-of-an-oracle-sequence-without-increment-it

반응형