테이블에서 최대값으로 시작하는 Oracle 시퀀스를 작성하려면 어떻게 해야 합니까?
Oracle에서 특정 테이블의 최대값으로 시작하는 시퀀스를 생성하려고 합니다.왜 이게 안 되는 거죠?
CREATE SEQUENCE transaction_sequence
MINVALUE 0
START WITH (SELECT MAX(trans_seq_no)
FROM TRANSACTION_LOG)
INCREMENT BY 1
CACHE 20;
PL/SQL을 사용할 수 있는 경우 다음을 시도해 보십시오(EDIT: Neil의 xlnt 제안을 통합하여 다음 높은 값으로 시작합니다).
SELECT 'CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH '||MAX(trans_seq_no)+1||' INCREMENT BY 1 CACHE 20'
INTO v_sql
FROM transaction_log;
EXECUTE IMMEDIATE v_sql;
고려해야 할 또 다른 점:CASH 파라미터를 20으로 설정하면 데이터베이스가 다운되었을 때 시퀀스에서 최대 19개의 값이 손실될 위험이 있습니다.데이터베이스 재시작 시 CACHED 값이 손실됩니다.시퀀스를 자주 치거나 간격에 관심이 없는 한 1로 설정합니다.
마지막으로 CASHE 및 INCREENT BY 에 지정한 값이 기본값입니다.그것들을 끄고 같은 결과를 얻을 수 있습니다.
여기 제대로 작동하는 예가 있습니다.
declare
ex number;
begin
select MAX(MAX_FK_ID) + 1 into ex from TABLE;
If ex > 0 then
begin
execute immediate 'DROP SEQUENCE SQ_NAME';
exception when others then
null;
end;
execute immediate 'CREATE SEQUENCE SQ_NAME INCREMENT BY 1 START WITH ' || ex || ' NOCYCLE CACHE 20 NOORDER';
end if;
end;
우선은 이 제품명칭해서max(trans_seq_no) + 1.
시청:
SQL> create table my_numbers(my_number number not null primary key);
Table created.
SQL> insert into my_numbers(select rownum from user_objects);
260 rows created.
SQL> select max(my_number) from my_numbers;
MAX(MY_NUMBER)
--------------
260
SQL> create sequence my_number_sn start with 260;
Sequence created.
SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
insert into my_numbers(my_number) values (my_number_sn.NEXTVAL)
*
ERROR at line 1:
ORA-00001: unique constraint (NEIL.SYS_C00102439) violated
숫자를 사용하여 시퀀스를 작성할 경우 시퀀스에 대해 처음 선택할 때 Oracle이 해당 시퀀스에 할당한 초기 값을 반환한다는 점을 기억해야 합니다.
SQL> drop sequence my_number_sn;
Sequence dropped.
SQL> create sequence my_number_sn start with 261;
Sequence created.
SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
1 row created.
만약 당신이 '틈없는' 일을 하려고 한다면, 나는 당신에게 강하게 충고한다.
1은 사용하지 않고 2는 시퀀스를 사용하지 않습니다.
서브셀렉트는 내부에서는 사용할 수 없습니다.CREATE SEQUENCE진술.미리 값을 선택해야 합니다.
중간을 유지하면 MAX 값은 커밋된 값의 최대값만 됩니다.1234가 반환될 수 있으며, 누군가가 이미 1235를 삽입했지만 커밋하지 않은 것을 고려해야 할 수도 있습니다.
코드 수가 적고 심플한 Ivan Laharnar를 기반으로 합니다.
declare
lastSeq number;
begin
SELECT MAX(ID) + 1 INTO lastSeq FROM <TABLE_NAME>;
if lastSeq IS NULL then lastSeq := 1; end if;
execute immediate 'CREATE SEQUENCE <SEQUENCE_NAME> INCREMENT BY 1 START WITH ' || lastSeq || ' MAXVALUE 999999999 MINVALUE 1 NOCACHE';
end;
DECLARE
v_max NUMBER;
BEGIN
SELECT (NVL (MAX (<COLUMN_NAME>), 0) + 1) INTO v_max FROM <TABLE_NAME>;
EXECUTE IMMEDIATE 'CREATE SEQUENCE <SEQUENCE_NAME> INCREMENT BY 1 START WITH ' || v_max || ' NOCYCLE CACHE 20 NOORDER';
END;
동적 SQL 사용
BEGIN
DECLARE
maxId NUMBER;
BEGIN
SELECT MAX(id)+1
INTO maxId
FROM table_name;
execute immediate('CREATE SEQUENCE sequane_name MINVALUE '||maxId||' START WITH '||maxId||' INCREMENT BY 1 NOCACHE NOCYCLE');
END;
END;
언급URL : https://stackoverflow.com/questions/798766/how-to-create-an-oracle-sequence-starting-with-max-value-from-a-table
'programing' 카테고리의 다른 글
| 에 JSON 데이터를 해석하는 최선의 방법입니다.NET 객체 (0) | 2023.03.25 |
|---|---|
| 지시문 '...'에 필요한 컨트롤러 'ngModel'을 찾을 수 없습니다. (0) | 2023.03.25 |
| Gradle을 사용하여 Android 프로젝트에 Boon 또는 Jackson JSON 파서를 추가하는 방법은 무엇입니까? (0) | 2023.03.25 |
| TypeScript용 커스텀글로벌인터페이스(.d.ts 파일)를 설정하는 방법 (0) | 2023.03.25 |
| 워드프레스를 위한 하위 플러그인을 만드는 방법 (0) | 2023.03.25 |