프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.4.0.24.05 ai Free

 

방법 : 오라클 23ai IF [NOT] EXISTS 구문

오라클 23ai 부터 ddl 구문 실행 시 IF EXISTS 또는 IF NOT EXISTS 구문을 사용할 수 있음
이 기능을 사용하면 DDL시 특정 오브젝트가 존재하거나 존재하지 않을때 발생하는 경우에 에러를 발생시킬지 말지 제어할 수 있음

 

 

IF [NOT] EXISTS 구문이 지원되는 오브젝트 유형
https://docs.oracle.com/en/database/oracle/oracle-database/23/adfns/sql-processing-for-application-developers.html#GUID-2B16C03D-D4D5-438B-8CFE-DFE97593C240

CREATE, DROP 구문 ALTER 구문
ANALYTIC VIEW ANALYTIC VIEW
ASSEMBLY  
ATTRIBUTE DIMENSION ATTRIBUTE DIMENSION
CLUSTER CLUSTER
DATABASE LINK DATABASE LINK
DIRECTORY  
DOMAIN DOMAIN
EDITION  
FUNCTION FUNCTION
HIERARCHY HIERARCHY
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
PROPERTY GRAPH PROPERTY GRAPH
SEQUENCE SEQUENCE
SYNONYM SYNONYM
TABLE TABLE
TABLESPACE TABLESPACE
TRIGGER TRIGGER
TYPE TYPE
TYPE BODY  
USER USER
VIEW VIEW

 

 

IF [NOT] EXISTS 구문이 지원되지 않는 경우
- 데이터 move시
- 파티션 add, drop, coalesce 시
- mview revalidate 시(compile, merge partition 등)
- private temporary 테이블 create, alter, drop 시

 

 

테스트
1. 테이블 create 시 IF NOT EXISTS 사용
2. 테이블 alert 시 IF EXISTS 사용
3. 테이블 drop 시 IF EXISTS 사용

 

 

테스트
1. 테이블 create 시 IF NOT EXISTS 사용
create 구문 실행시 테이블이 존재하지 않으면 테이블을 만들고 이미 존재해도 에러가 발생하지 않음
테이블 미 존재시

1
2
3
4
5
6
7
8
9
SQL> select * from t1;
              *
ERROR at line 1:
ORA-00942: table or view does not exist
Help: https://docs.oracle.com/error-help/db/ora-00942/
 
SQL> create table IF NOT EXISTS t1 (col1 varchar2(10));
 
Table created.

기존에 테이블이 존재하지 않았기 때문에 당연히 테이블이 정상적으로 생성됨

 

 

테이블 존재시

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
create table t1 (col1 varchar2(10));
insert into t1 values ('A');
commit;
select * from t1;
 
COL1
----------
A
 
SQL> create table IF NOT EXISTS t1 (col1 varchar2(10));
 
Table created.

기존에 테이블이 존재하는 상태에서 create 구문을 실행해도 에러가 발생하지 않음

 

 

2. 테이블 alert 시 IF EXISTS 사용
alter 구문 실행시 테이블이 존재하면 테이블을 수정하고 테이블이 존재하지 않아도 에러가 발생하지 않음
테이블 미 존재시

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> select * from t1;
              *
ERROR at line 1:
ORA-00942: table or view does not exist
Help: https://docs.oracle.com/error-help/db/ora-00942/
 
SQL> drop table t1 purge;
 
Table dropped.
 
SQL> alter table IF EXISTS t1 modify col1 varchar2(12);
 
Table altered.

테이블이 존재하지 않는 상태에서 alter 구문을 실행해도 에러가 발생하지 않음

 

 

테이블 존재시

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
create table t1 (col1 varchar2(10));
insert into t1 values ('A');
commit;
select * from t1;
 
COL1
----------
A
 
SQL> alter table IF EXISTS t1 modify col1 varchar2(12);
 
Table altered.

기존에 테이블이 존재했기 때문에 당연히 테이블이 정상적으로 수정됨

 

 

3. 테이블 drop 시 IF EXISTS 사용
drop 구문 실행시 테이블이 존재하면 테이블을 삭제하고 테이블이 존재하지 않아도 에러가 발생하지 않음
테이블 미 존재시

1
2
3
4
5
6
7
8
9
SQL> select * from t1;
              *
ERROR at line 1:
ORA-00942: table or view does not exist
Help: https://docs.oracle.com/error-help/db/ora-00942/
 
SQL> drop table IF EXISTS t1 purge;
 
Table dropped.

테이블이 존재하지 않는 상태에서 drop 구문을 실행해도 에러가 발생하지 않음

 

 

테이블 존재시

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
create table t1 (col1 varchar2(10));
insert into t1 values ('A');
commit;
select * from t1;
 
COL1
----------
A
 
SQL> drop table IF EXISTS t1 purge;
 
Table dropped.

기존에 테이블이 존재했기 때문에 당연히 테이블이 정상적으로 삭제됨

 

 

참조 : 

https://docs.oracle.com/en/database/oracle/oracle-database/23/adfns/sql-processing-for-application-developers.html#GUID-3818B089-D99D-437C-862F-CBD276BDA3F1
https://oracle-base.com/articles/18c/private-temporary-tables-18c