Oracle 23ai(23.9)부터 INSERT 문에 INSERT SET 절과 BY NAME POSITION 절을 사용할 수 있습니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER);
CREATE TABLE t2 (c1 NUMBER, c2 NUMBER, c3 NUMBER);
아래는 INSERT 문에 INSERT SET 절을 사용한 예제입니다. INSERT VALUES 절보다 명시적으로 칼럼과 값을 지정할 수 있어 오류 가능성을 줄일 수 있습니다. 주석 처리된 형식으로도 INSERT SET 절을 사용할 수 있습니다.
-- 2-1
INSERT INTO t1 SET c1 = 1, c2 = 2;
-- INSERT INTO t1 SET (c1 = 1, c2 = 2);
-- INSERT INTO t1 SET (c1 = 1, c2 = 2), (c1 = 3, c2 = 4);
-- 2-2
SELECT * FROM t1;
C1 C2
-- --
1 2
1 row selected.
아래는 INSERT 문에 BY NAME POSITION 절을 사용한 예제입니다. 기본값은 BY POSITION입니다. SELECT 절의 표현식에 별칭을 사용하지 않거나 INSERT 문의 칼럼 리스트와 SELECT 절의 칼럼 명이 일치하지 않으면 에러가 발생합니다.
-- 3-1: BY { NAME | POSITION }
INSERT INTO t2 (c1, c2, c3) BY NAME SELECT c2, c1, c1 + c2 AS c3 FROM t1;
-- 3-2
SELECT * FROM t2;
C1 C2 C3
-- -- --
1 2 3
1 row selected.
-- 3-3
INSERT INTO t2 (c1, c2, c3) BY NAME SELECT c2, c1, c1 + c2 FROM t1;
ORA-63875: Non-aliased expressions or constants are not allowed in a BY NAME clause.
-- 3-4
INSERT INTO t2 (c1, c2, c3) BY NAME SELECT c2, c1, c1 + c2 AS c4 FROM t1;
ORA-63877: The explicit column list does not exactly match the exposed column names.