수동으로 시퀀스 전달 - 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
'programing' 카테고리의 다른 글
| 양식 제출 전 jQuery 기능 (0) | 2023.10.16 |
|---|---|
| powershell이 있는 파일 이름의 각 단어 첫 글자 대문자화 (0) | 2023.10.16 |
| 테이블의 빈 행 제거 (0) | 2023.10.16 |
| ASP에서 HTML을 생성하는 현재 최고의 솔루션은 무엇입니까?콘솔 애플리케이션 내의 NET 레이저 템플릿? (0) | 2023.10.16 |
| jquery mobile collapsable and galaxy tab 10.1 json 응답으로 무작위 응답 제공 (0) | 2023.10.11 |