source

시퀀스 값을 사용하여 여러 행을 Oracle에 삽입하려면 어떻게 해야 합니까?

manysource 2023. 3. 21. 22:22

시퀀스 값을 사용하여 여러 행을 Oracle에 삽입하려면 어떻게 해야 합니까?

이 답변에서 구문을 사용하면 하나의 문을 사용하여 여러 행을 삽입할 수 있습니다.

그러나 삽입하는 값 중 하나는 시퀀스에서 가져온 것입니다.

insert into TABLE_NAME
(COL1,COL2)
select MY_SEQ.nextval,'some value' from dual
union all
select MY_SEQ.nextval,'another value' from dual
;

실행하려고 하면 ORA-02287 오류가 나타납니다.다른 방법이 없을까요?아니면 INSERT 문구를 많이 사용해야 하나요?

편집:
시퀀스를 제외한 다른 모든 열에 대해 열 이름을 지정해야 하는 경우 원래 간결성이 손실되므로 그럴 가치가 없습니다.이 경우 여러 INSERT 문을 사용합니다.

이 방법은 다음과 같습니다.

insert into TABLE_NAME (COL1,COL2)
select my_seq.nextval, a
from
(SELECT 'SOME VALUE' as a FROM DUAL
 UNION ALL
 SELECT 'ANOTHER VALUE' FROM DUAL)

다음 시나리오에서는 시퀀스가 동작하지 않기 때문에 동작하지 않습니다.

  • WHERE 절에서
  • GROUP BY 또는 ORDER BY 절에서
  • DISTINCT 절에서
  • UNION, 크로스 또는 마이너스와 함께
  • 서브쿼리에서

출처 : http://www.orafaq.com/wiki/ORA-02287

단, 이것은 기능합니다.

insert into table_name
            (col1, col2)
  select my_seq.nextval, inner_view.*
    from (select 'some value' someval
            from dual
          union all
          select 'another value' someval
            from dual) inner_view;

시험해 보세요.

create table table_name(col1 varchar2(100), col2 varchar2(100));

create sequence vcert.my_seq
start with 1
increment by 1
minvalue 0;

select * from  table_name;
insert into TABLE_NAME
(COL1,COL2)
WITH
data AS
(
    select 'some value'    x from dual
    union all
    select 'another value' x from dual
)
SELECT my_seq.NEXTVAL, x 
FROM data
;

그게 당신이 원하는 거라고 생각하지만, 지금은 그걸 테스트할 수 있는 오라클에 접근할 수 없어요.

Oracle Wiki에서 오류 02287은

ORA-02287은 허용되지 않는 시퀀스를 사용할 때 발생합니다.

시퀀스를 사용할 수 없는 장소 중 다음을 시도하고 있는 것 같습니다.

서브쿼리에서

그래서 같은 문장에서 배수는 할 수 없는 것 같아요.

델이 제공하는 솔루션은 다음과 같습니다.

생성된 모든 행에 대해 시퀀스 값을 열에 삽입하려면 삽입 전 트리거를 생성하고 트리거에서 시퀀스 값을 가져와 열에 할당합니다.

삽입 시 트리거를 생성하여 올바른 시퀀스 번호를 추가할 수 있습니다.

이것은 작동하며 유니온 모두를 사용할 필요가 없습니다.

Insert into BARCODECHANGEHISTORY (IDENTIFIER,MESSAGETYPE,FORMERBARCODE,NEWBARCODE,REPLACEMENTDATETIME,OPERATORID,REASON)
select SEQ_BARCODECHANGEHISTORY.nextval, MESSAGETYPE, FORMERBARCODE, NEWBARCODE, REPLACEMENTDATETIME, OPERATORID, REASON
from (
  SELECT
    'BAR' MESSAGETYPE,
    '1234567890' FORMERBARCODE,
    '1234567899' NEWBARCODE,
    to_timestamp('20/07/12','DD/MM/RR HH24:MI:SSXFF') REPLACEMENTDATETIME,
    'PIMATD' OPERATORID,
    'CORRECTION' REASON
  FROM dual
);

언급URL : https://stackoverflow.com/questions/228221/how-can-i-insert-multiple-rows-into-oracle-with-a-sequence-value