[Oracle] 오라클 INSERT 방법 & 노하우 정리 (데이터 입력)
- 데이터베이스/오라클
- 2021. 5. 12.
오라클에서 테이블에 데이터를 입력할 때는 INSERT 문을 사용하면 된다. INSERT 문은 SQL의 아주 기본이지만 상황에 따라서 다양한 방법으로 사용할 수 있으니, 아래를 예제를 참고하면 앞으로 INSERT 문의 활용에 도움이 될 것이다.
기본 사용법 1
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20)
INTO 절의 컬럼 개수와 데이터 타입이 VALUES 절의 컬럼 개수와 데이터 타입이 동일해야 한다. VALUES 절에 테이블의 모든 컬럼이 나열되어 있다면, INTO 절의 컬럼을 생략할 수 있지만, INTO 절에 입력할 컬럼을 모두 나열하는 방식을 권장한다.
기본 사용법 2 (컬럼명 생략)
INSERT INTO emp
VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20)
VALUES 절에 입력할 테이블의 모든 컬럼이 나열되어 있다면 INTO 절의 컬럼은 생각해도 된다. 실무에서 쿼리를 작설할 때는 꼭 INTO 절에 컬럼을 모두 작성할 것을 권장한다. 테이블에 컬럼이 추가되거나 삭제되었을 경우 기존 쿼리문에 오류가 발생할 수 있기 때문이다.
일련번호 채번 후 INSERT (MAX + 1)
INSERT INTO emp ( empno
, ename
, job
, mgr
, hiredate
, sal
, comm
, deptno
)
VALUES ( (SELECT NVL(MAX(empno), 0) + 1 FROM emp)
, 'SCOTT'
, 'ANALYST'
, 7566
, TO_DATE('1987-04-19', 'YYYY-MM-DD')
, 3000
, NULL
, 20
)
VALUES 절에서 서브 쿼리를 사용하여 일련번호를 매번 후 INSERT를 수행할 수 있다. 오라클은 컬럼에 자동 증가 옵션이 없기 때문에, 시퀀스 또는 MAX + 1 같은 방법을 활용하여 일련번호를 생성한다.
서브 쿼리 INSERT (SELECT INSERT)
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT 8000
, a.ename
, a.job
, a.mgr
, a.hiredate
, a.sal
, a.comm
, a.deptno
FROM emp a
WHERE a.empno = 7788
VALUES 절 대신에 서브 쿼리를 사용하여 여러 건의 데이터를 INSERT 하거나, 기본 값을 조회 후 파라미터로 전달된 값과 합쳐서 INSERT를 할 때 사용한다.
INSERT ALL, FIRST 사용법
INSERT ALL
WHEN sal >= 3000 THEN
INTO emp_sal1 VALUES (empno, ename, sal)
WHEN sal >= 2000 THEN
INTO emp_sal2 VALUES (empno, ename, sal)
ELSE
INTO emp_sal3 VALUES (empno, ename, sal)
SELECT a.empno
, a.ename
, a.sal
FROM emp a
WHERE a.empno = 7788
INSERT ALL을 사용하면 한 번에 여러 개의 테이블에 INSERT를 할 수 있다. 조건(WHEN~THEN)에 만족하면 해당 테이블에 INSERT 한다. sal이 3000인 경우 emp_sql1, emp_sal2 두개의 테이블에 INSERT한다. (단, INSERT ALL, FIRST는 반드시 서브 쿼리와 함께 사용해야 한다)
INSERT FIRST
WHEN sal >= 3000 THEN
INTO emp_sal1 VALUES (empno, ename, sal)
WHEN sal >= 2000 THEN
INTO emp_sal2 VALUES (empno, ename, sal)
ELSE
INTO emp_sal3 VALUES (empno, ename, sal)
SELECT a.empno
, a.ename
, a.sal
FROM emp a
WHERE a.empno = 7788
INSERT FIRST는 조건에 만족하는 첫 번째 WHEN~THEN의 테이블에만 INSERT 한다. sal이 3000인 경우 emp_sql1 테이블에 INSERT한다.
DEFINE empno = 8800;
DEFINE ename = 'SCOTT';
DEFINE sal = 3000;
INSERT ALL
WHEN &sal >= 3000 THEN
INTO emp_sal1 VALUES (&empno, &ename, &sal)
WHEN &sal >= 2000 THEN
INTO emp_sal2 VALUES (&empno, &ename, &sal)
ELSE
INTO emp_sal3 VALUES (&empno, &ename, &sal)
SELECT *
FROM dual
서브 쿼리를 사용하지 않을 경우 dual을 사용하면 된다. 파라미터를 전달된 값으로 조건을 만들고 INSERT 하면 된다.