programing

수동으로 시퀀스 전달 - oracle sql

sourcejob 2023. 10. 16. 21:48
반응형

수동으로 시퀀스 전달 - oracle sql

DML 접속만 가능한 일련의 시퀀스를 전달해야 합니다.코드 조각의 버그로 인해 몇 개의 값이 시퀀스 없이 수동으로 잡혔기 때문에 현재 시퀀스가 해당 값을 복제하고 있습니다.그래서 다음 번 nextval을 호출할 때 최대값보다 높은 값을 주도록 sequence를 최대값으로 밀어 넣었으면 합니다.저는 각각 몇천개씩 진행해야하는 50개의 시퀀스를 가지고 있습니다.

이것은 DML만 접속하면 가능합니까?그렇다면 어떻게 해야 할까요?

시퀀스의 다음 값과 필요한 값의 차이를 결정해야 합니다.필요한 값은 일반적으로 기본 키 열의 최대값입니다(ID라고 합니다).

DECLARE
    maxid NUMBER;
    maxseq NUMBER;
    temp NUMBER;  -- without this variable Oracle would skip to query the sequence
BEGIN
    SELECT MAX(ID) INTO maxid FROM MYTABLE;
    SELECT MYSEQ.NEXTVAL INTO maxseq FROM DUAL;
    FOR i IN maxseq .. maxid LOOP
        SELECT MYSEQ.NEXTVAL INTO temp FROM DUAL;
    END LOOP;
END;
/

동적 SQL을 사용하여 이 작업을 수행할 수 있습니다.예를 들어, 이 코드 비트는 시퀀스 목록에서 각각 다음 10,000개의 값을 선택합니다.

DECLARE
  l_num INTEGER;
BEGIN
  FOR seq IN (select * 
                from all_sequences
                where sequence_name in (<<list of 50 sequences>>) 
                  and sequence_owner = <<owner of sequences>>)
  LOOP
    FOR i IN 1 .. 10000
    LOOP
      execute immediate 
         'select ' || seq.sequence_owner || '.' || seq.sequence_name || '.nextval from dual'
         into l_num;
    END LOOP;
  END LOOP;
END;

만약 당신이 시퀀스에 대항하여 DDL을 발행할 능력이 있다면, 당신은 유사한 접근법을 사용하여 설정할 수 있습니다.INCREMENT10,000으로, 시퀀스에서 하나의 값을 선택하고,INCREMENT1(또는 지금 무엇이든)로 되돌아갑니다.

당신은 그냥

select seq.nextval from dual 

충분히 커질때까지...

시퀀스에 추가하려는 양만큼의 행이 있는 테이블이 있으면 다음이 작동합니다.이렇게 하면 각 시퀀스가 동일한 양만큼 증가하므로 적합하지 않을 수 있지만 PL/SQL이나 시퀀스를 삭제/재생성할 필요 없이 빠르고 쉽습니다.생산에 앞서 개발 서버 시퀀스를 받고 싶을 때 항상 사용합니다.

SELECT seq1.nextval, seq2.nextval, ..., seqN.nextval
  FROM very_large_table
 WHERE ROWNUM <= number_of_rows_to_add

시퀀스를 다른 값으로 다시 시작하려면 해당 시퀀스를 삭제하고 재생성해야 합니다.

다음에 대한 Oracle 문서 참조ALTER SEQUENCE 여기에

그리고.CREATE SEQUENCE 여기서

Randy가 제안하는 것처럼 반복적으로 증가하지 않는 한 DML 액세스에서는 불가능하다고 생각합니다.

당신은 그냥 할 수 있습니다;

declare
  l_MaxVal  pls_integer;
  l_Currval pls_integer default - 1;
begin
  select max(id)
    into l_MaxVal
    from people;
  while l_Currval < l_Maxval
  loop
    select my_seq.nextval
      into l_Currval
      from dual;
  end loop;
end;

한 행에 하나씩 일련의 숫자를 선택하는 데 사용할 수 있는 방법이 있습니다.예를 들어,

SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM <= 100

교체하다ROWNUM와 함께<sequence>.NEXTVAL다음과 같이 큰 단계로 시퀀스를 빠르게 전달합니다.

SELECT <sequence>.NEXTVAL FROM DUAL CONNECT BY ROWNUM <= 100

프로덕션 데이터베이스를 변경할 때는 사용하지 않지만 개발 데이터베이스의 경우에는 충분할 수 있습니다.

언급URL : https://stackoverflow.com/questions/9609463/manually-forward-a-sequence-oracle-sql

반응형