복붙노트

[SQL] 어떻게 증가없이 오라클 시퀀스의 현재 값을 검색하는?

SQL

어떻게 증가없이 오라클 시퀀스의 현재 값을 검색하는?

를 증가시키지 않는 시퀀스의 값을 검색 할 수있는 SQL 명령이있다.

감사.

편집 및 결론

저스틴 동굴에서 언급 한 바와 같이 너무 일련 번호 "저장"을 시도하는 것이 유용 아니다

select a_seq.nextval from dual;

시퀀스 값을 확인하기 위해 충분한입니다.

이 최초의 질문에 대답 때문에 나는 여전히 좋은으로 올리 응답을 유지한다. 하지만 만약 당신이 그것을 수행하려는 경우 순서를 수정하지의 필요성에 대해 자신에게 물어.

해결법

  1. ==============================

    1.

    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>';
    

    희망이 도움이 ...

    Aaditi :

    더 안정적으로 캐시 크기가 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에 캐시를 설정할 수 있습니다.

  2. ==============================

    2.DUAL에서 MY_SEQ_NAME.currval을 선택;

    DUAL에서 MY_SEQ_NAME.currval을 선택;

    당신이 DUAL에서 MY_SEQ_NAME.nextval를 선택하여 실행 한 경우에만 작동 명심하십시오; 현재 세션한다.

  3. ==============================

    3.내 원래의 대답은 사실에 입각하여 정확하고 나는 그것을 제거 기뻐요. 다음과 같은 조건에서 의지 작업 아래의 코드는) 당신은 순서가 세션에 의해 수정 된) 다른 그 누구도 시퀀스 B를 수정되지 알고있다. 내가 값을 수정 프로 시저를 호출하고 있었고, 난이 가정이 사실 확신 어디에 내 경우, 나는 비슷한 문제가 발생했습니다.

    내 원래의 대답은 사실에 입각하여 정확하고 나는 그것을 제거 기뻐요. 다음과 같은 조건에서 의지 작업 아래의 코드는) 당신은 순서가 세션에 의해 수정 된) 다른 그 누구도 시퀀스 B를 수정되지 알고있다. 내가 값을 수정 프로 시저를 호출하고 있었고, 난이 가정이 사실 확신 어디에 내 경우, 나는 비슷한 문제가 발생했습니다.

    SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;
    

    당신이 당신의 세션에서 순서를 수정하지 않은 경우 슬프게도, 나는 다른 사람들이 NEXTVAL가 갈 수있는 유일한 방법이라고 주장에서 올바른 생각합니다.

  4. ==============================

    4.이건 정말, 대답하지 않고 주석이 문제가되지 잠겨 있었다 나는 그것을 입력 한 것입니다. 이 질문에 대한 답 :

    이건 정말, 대답하지 않고 주석이 문제가되지 잠겨 있었다 나는 그것을 입력 한 것입니다. 이 질문에 대한 답 :

    왜 당신이 그것을 원하는 것?

    당신이 기본 키 순서로 테이블이 있고 시퀀스가 ​​삽입 트리거에 의해 생성되는 가정합니다. 이 기록에 대한 후속 업데이트에 사용할 수있는 순서를 가지고 싶었다면, 당신은 그 값을 추출 할 수있는 방법이 필요합니다.

    당신이 바로 하나를 얻을 수 있도록하기 위해, 당신은 INSERT 및 거래에 RonK의 쿼리를 포장 할 수 있습니다.

    Ronk의 쿼리 :

    select MY_SEQ_NAME.currval from DUAL;
    

    위의 시나리오에서, RonK의주의해야 할 점은 삽입 이후에는 적용되지 않으며 업데이트는 같은 세션에서 일어날 것입니다.

  5. ==============================

    5.나는 또한 어떤 프로세스가 기본 키 그 순서와 일부 테이블에 새 행을 삽입 한 경우 알아 내 경우 CURRVAL을 사용하려고했습니다. 내 가정은 CURRVAL 가장 빠른 방법이 될 것이라고했다. 그러나) CURRVAL은 다른 오라클 세션에 있기 때문에 당신이 당신의 자신의 세션에서 NEXTVAL을 할 때까지 그냥 이전 값을 얻을 것이다,하지 작업을 수행합니다. 그리고 b)는 TheTable에서 선택 최대 (PK)는 PK가 항상 색인 아마도 때문에, 매우 빠릅니다. 또는 TheTable에서 COUNT (*)을 선택합니다. 나는 아직도 실험하고 있지만, 모두에 select 빠른 것 같다.

    나는 또한 어떤 프로세스가 기본 키 그 순서와 일부 테이블에 새 행을 삽입 한 경우 알아 내 경우 CURRVAL을 사용하려고했습니다. 내 가정은 CURRVAL 가장 빠른 방법이 될 것이라고했다. 그러나) CURRVAL은 다른 오라클 세션에 있기 때문에 당신이 당신의 자신의 세션에서 NEXTVAL을 할 때까지 그냥 이전 값을 얻을 것이다,하지 작업을 수행합니다. 그리고 b)는 TheTable에서 선택 최대 (PK)는 PK가 항상 색인 아마도 때문에, 매우 빠릅니다. 또는 TheTable에서 COUNT (*)을 선택합니다. 나는 아직도 실험하고 있지만, 모두에 select 빠른 것 같다.

    나는 순서에서 틈을 신경 쓰지 않지만, 내 경우에는 내가 폴링을 많이 생각하고, 나는 매우 큰 격차의 아이디어를 싫어한다. 특히 간단한 경우 SELECT는 빨리 될 것이다.

    결론:

  6. from https://stackoverflow.com/questions/10210273/how-to-retrieve-the-current-value-of-an-oracle-sequence-without-increment-it by cc-by-sa and MIT license