programing

테이블에서 최대값으로 시작하는 Oracle 시퀀스를 작성하려면 어떻게 해야 합니까?

easyjava 2023. 3. 25. 14:06
반응형

테이블에서 최대값으로 시작하는 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

반응형