메뉴 건너뛰기

Korea Oracle User Group

23c Free Developer Release

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 버전은 개발자를 위한 기능에 대해서 많이 추가한 듯하고 이런 행보를 오라클도 

메인으로 두고 홍보할 거 같습니다.

위로