programing

Oracle에서 시퀀스가 있는 여러 행 삽입

kingscode 2023. 8. 9. 22:17
반응형

Oracle에서 시퀀스가 있는 여러 행 삽입

Oracle 데이터베이스에 여러 행을 삽입하기 위해 사용한 쿼리입니다.그러나 그 안에서 시퀀스를 사용하면 ORA-00001: 고유 제약 조건으로 오류가 발생합니다.하는 방법.

INSERT ALL
  INTO POSTAL_CODE( postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Coimbatore')
  INTO POSTAL_CODE (postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Mumbai') SELECT * FROM DUAL;

다중 가능한 삽입물에 대한 제한은 다음과 같습니다.

  • 다중 삽입 문의 어떤 부분에서도 시퀀스를 지정할 수 없습니다.다중 삽입은 단일 SQL 문으로 간주됩니다.따라서 NEXTVAL에 대한 첫 번째 참조는 다음 번호를 생성하고 문의 모든 후속 참조는 동일한 번호를 반환합니다.

그렇지 않습니다. 시퀀스를 사용하면 항상 동일한 값을 얻을 수 있으므로 동일한 시퀀스를 참조하여 한 번에 부모 및 자식 레코드를 만드는 것이 유용할 수 있습니다.

계속 사용하려면insert all시퀀스 값을 가져오는 비결정론적 함수를 사용하여 이 문제를 해결할 수 있습니다.

CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
  RETURN postal_code_seq.nextval;
END;
/

INSERT ALL
  INTO POSTAL_CODE( postal_code,description)
    VALUES(get_seq,'Coimbatore')
  INTO POSTAL_CODE (postal_code,description)
    VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;

2 rows inserted.

SELECT * FROM postal_code;

                            POSTAL_CODE DESCRIPTION        
--------------------------------------- --------------------
                                      1 Coimbatore          
                                      2 Mumbai              

그런데 좀 어색하네요.개별 삽입문을 사용하는 것이 더 나을 수도 있습니다. 단일 테이블에 다중 삽입을 사용하는 것은 실제로 별로 도움이 되지 않습니다. 또는 시퀀스에서 고유한 열을 설정하는 트리거를 사용하거나 삽입할 값을 생성하는 CTE/인라인 뷰를 사용하는 것이 좋습니다.

데이터베이스 개체를 수정하는 대신 다중 테이블을 간단히 다시 작성할 수 있습니다.INSERT ALL단판에INSERT여러 행이 연결된 상태에서UNION ALL:

INSERT INTO postal_code
SELECT postal_code_seq.NEXTVAL, description
FROM
(
    SELECT 'Coimbatore' description FROM dual UNION ALL
    SELECT 'Mumbai'     description FROM dual
);

시퀀스는 외부 쿼리에서 호출되어야 합니다.내부 쿼리에서 시퀀스를 사용하면 코드를 단순화할 수 있지만 "ORA-02287: 시퀀스 번호가 여기서 허용되지 않음" 오류가 발생합니다.

이 방법 대신 삽입 전 트리거를 사용하여 키 열을 채울 것입니다(삽입에서 값이 제공되지 않은 경우).시퀀스는 다중 테이블 삽입에서 잘 작동하지 않습니다.

POSTAL_CODE(postal_code, desc) 값(postal_code)에 모두 삽입합니다.NEXTVAL,&desc) POSTAL_CODE(postal_code,desc) 값(postal_code)에 입력합니다.NEXTVAL, &desc) 선택*(듀얼에서)

Oracle 데이터베이스에 이 다중 행을 삽입하려고 합니다.

INTO POSTAL_CODE (postal_code,desc)
VALUES(&postal_code,&desc) SELECT * FROM DUAL;

언급URL : https://stackoverflow.com/questions/31968093/inserting-multiple-rows-with-sequence-in-oracle

반응형