IF EXISTS와 IF NOT EXISTS 사용
이제 object의 CREATE, ALTER, DROP에서 IF EXISTS와 IF NOT EXISTS 문장을 사용할 수 있습니다.
IF EXISTS와 IF NOT EXISTS 문장을 사용하게 됨으로써
기존에 스크립트에서 DDL 문장 사용시 object가 있거나 없을 때
발생하는 에러를 방지할 수 있습니다.
CREATE 문장의 경우 IF NOT EXISTS 문장과 같이 사용하게 됩니다.
ALTER 문장의 경우 IF EXISTS 문장과 같이 사용하게 됩니다.
DROP 문장의 경우 IF EXISTS 문장과 같이 사용하게 됩니다.
아래는 IF EXISTS와 IF NOT EXISTS를 지원하는 object 목록 입니다.
CREATE and DROP Commands | ALTER Command |
---|---|
ANALYTIC VIEW |
ANALYTIC VIEW |
ASSEMBLY |
|
ATTRIBUTE DIMENSION |
ATTRIBUTE DIMENSION |
CLUSTER |
CLUSTER |
DATABASE LINK |
DATABASE LINK |
DIRECTORY |
|
DOMAIN |
|
EDITION |
|
FUNCTION |
FUNCTION |
HIERARCHY |
HIERARCHY |
INDEX |
INDEX |
INDEXTYPE |
INDEXTYPE |
INMEMORY JOIN GROUP |
INMEMORY JOIN GROUP |
JAVA |
JAVA |
LIBRARY |
LIBRARY |
MATERIALIZED VIEW |
MATERIALIZED VIEW |
MATERIALIZED VIEW LOG |
MATERIALIZED VIEW LOG |
MATERIALIZED ZONEMAP |
MATERIALIZED ZONEMAP |
MLE ENV |
MLE ENV |
MLE MODULE |
MLE MODULE |
OPERATOR |
OPERATOR |
PACKAGE |
PACKAGE |
PACKAGE BODY |
|
PROCEDURE |
PROCEDURE |
SEQUENCE |
SEQUENCE |
SYNONYM |
SYNONYM |
TABLE |
TABLE |
TABLESPACE |
TABLESPACE |
TRIGGER |
TRIGGER |
TYPE |
TYPE |
TYPE BODY |
|
USER |
USER |
VIEW |
VIEW |
CREATE OR REPLACE 문장과는 같이 사용할 수 없습니다.
CREATE 문장으로 해서 IF NOT EXISTS와 같이 사용할 수 있습니다.
위 내용에 대해서 테스트해 보겠습니다.
먼저 EMPLOYEES, EMPLOYEES2 테이블의 존재를 확인 합니다.
1
2
3
4
5
6
7
8
|
SQL> COL TABLE_NAME FOR A15
SQL> SELECT TABLE_NAME
2 FROM USER_TABLES
3 WHERE TABLE_NAME LIKE 'EMPLOYEE%';
TABLE_NAME
---------------
EMPLOYEES
|
현재 EMPLOYEES 테이블만 있습니다.
EMPLOYEES 테이블을 IF NOT EXISTS 구문 없이 만들어 보고 또 IF NOT EXISTS 구문과 같이 사용해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
SQL> CREATE TABLE EMPLOYEES (COL1 VARCHAR2(10));
CREATE TABLE EMPLOYEES (COL1 VARCHAR2(10))
*
1행에 오류:
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.
SQL> CREATE TABLE IF NOT EXISTS EMPLOYEES (COL1 VARCHAR2(10));
테이블이 생성되었습니다.
SQL> SELECT TABLE_NAME
2 FROM USER_TABLES
3 WHERE TABLE_NAME LIKE 'EMPLOYEE%';
TABLE_NAME
---------------
EMPLOYEES
|
IF NOT EXISTS 구문 없이 사용한 CREATE 문장은 같은 명칭의 테이블이 있다면서 에러를 발생합니다.
하지만 IF NOT EXISTS 구문을 사용한 CREATE 문장은 에러 없이 테이블이 생성되었다고 나옵니다.
그러나 테이블이 생성된 것이 아니라 존재하기 때문에 생성하지 않고 스킵한 것입니다.
이제 ALTER 문과 DROP 문장을 테스트 해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
SQL> ALTER TABLE IF EXISTS EMPLOYEES ADD (COL1 VARCHAR2(10));
테이블이 변경되었습니다.
SQL> ALTER TABLE IF EXISTS EMPLOYEES2 ADD (COL1 VARCHAR2(10));
테이블이 변경되었습니다.
SQL> DROP TABLE IF EXISTS EMPLOYEES2;
테이블이 삭제되었습니다.
SQL> SELECT TABLE_NAME
2 FROM USER_TABLES
3 WHERE TABLE_NAME LIKE 'EMPLOYEE%';
TABLE_NAME
---------------
EMPLOYEES
SQL> DROP TABLE IF EXISTS EMPLOYEES;
테이블이 삭제되었습니다.
SQL> SELECT TABLE_NAME
2 FROM USER_TABLES
3 WHERE TABLE_NAME LIKE 'EMPLOYEE%';
선택된 레코드가 없습니다.
|
ALTER 문장의 경우 EMPLOYEES와 같이 있는 테이블은 컬럼을 추가했고
EMPLOYEES2 와 같이 없는 테이블은 없어서 해당 작업을 수행하지 못했지만
에러 없이 스킵했지만 테이블이 변경되었습니다라고 메세지를 뿌려줍니다.
DROP 문장 역시 없는 IF EXISTS 구문과 같이 사용했을 때 EMPLOYEES2 테이블이 없지만
에러 없이 테이블이 삭제되었습니다라고 메세지가 나오지만 스킵된 것을 확인할 수 있습니다.
그리고 EMPLOYEES 테이블과 같이 있는 테이블은 삭제처리를 하게 됩니다.
마무리
IF EXISTS와 IF NOT EXISTS 구문의 추가는 스크립트 수행, 혹은 배치 작업에 있어서 유연한 스크립트 작성을 지원해 줄 것 같습니다.
어떻게 생각하면 큰 기능은 아닐지 모르지만 유용할 수 있는 기능이긴 합니다.
알아두면 편할만한 기능이라고 생각이 듭니다.
이번 23c 버전은 개발자를 위한 기능에 대해서 많이 추가한 듯하고 이런 행보를 오라클도
메인으로 두고 홍보할 거 같습니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
11 | (23c 신기능) GROUP BY 절에 컬럼 별칭이나 포지션 사용 | 명품관 | 2023.04.26 | 966 |
10 | (23c 신기능) UPDATE 문장을 위한 Default 값 NULL 설정 가능 | 명품관 | 2023.04.26 | 616 |
9 | (23c 신기능) PL/SQL 에서 SQL로 Transpiler 자동변환(Automatic PL/SQL to SQL Transpiler) | 명품관 | 2023.04.25 | 266 |
8 | (23c 신기능) INTERVAL 데이터타입에 집계함수와 분석함수 사용 가능 | 명품관 | 2023.04.20 | 363 |
7 | (23c 신기능) 23c에서 개발자를 위해 새로 추가된 DB_DEVELOPER_ROLE role | 명품관 | 2023.04.19 | 259 |
» | (23c 신기능) IF EXISTS와 IF NOT EXISTS 사용 | 명품관 | 2023.04.18 | 1470 |
5 | (23c 신기능) Annotation 사용하기(comment와 유사한) | 명품관 | 2023.04.18 | 221 |
4 | (23c 신기능) Direct Joins for UPDATE and DELETE Statements(직접 조인을 사용한 UPDATE, DELETE) | 명품관 | 2023.04.12 | 214 |
3 | JSON-Relational Duality View 튜토리얼 | 명품관 | 2023.04.10 | 173 |
2 | 오라클 프로세스 prefix가 ora_ 에서 db_로 변경 | 명품관 | 2023.04.06 | 208 |
1 | Oracle Database 23c Free Install with Oracle Linux 8.2(리눅스 8.2 버전에서 오라클 23c 설치) [1] | 명품관 | 2023.04.05 | 1604 |