Oracle/SQL*Plus2019. 3. 4. 11:10
SQL*Plus의 에러 처리 기능을 살펴보자.

테스트를 위해 아래와 같이 테이블을 생성하자.

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t1_t PURGE;

CREATE TABLE t1 AS SELECT 1 AS c1 FROM XMLTABLE ('1 to 10');
CREATE TABLE t1_t (c1 NUMBER);


아래는 t1 테이블을 재구성(reorganization)하기 위한 쿼리다. 해당 내용으로 s1.sql 파일을 생성하자.

-- 2
CREATE TABLE t1_t AS SELECT * FROM t1;
TRUNCATE TABLE t1;
INSERT INTO t1 SELECT * FROM t1_t ORDER BY c1;

s1.sql 파일을 수행해보자. t1_t 테이블이 존재하므로 첫 번째 쿼리에서 에러가 발생했고, 이후 쿼리가 수행되어 t1 테이블의 데이터가 유실되었다.

-- 3
@s1

CREATE TABLE t1_t AS SELECT * FROM t1
             *
1행에 오류:
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.

테이블이 잘렸습니다.

0 행이 생성되었습니다.


SQL*Plus의 에러 처리 옵션은 WHENEVER SQLERROR 명령어로 설정한다. 기본값이 CONTINUE NONE이기 때문에 에러가 발생하더라도 이후 쿼리가 수행된 것이다.

-- 4
WHENEVER SQLERROR

사용법: WHENEVER SQLERROR
     { CONTINUE  [ COMMIT | ROLLBACK | NONE ]
     | EXIT  [ SUCCESS | FAILURE | WARNING | n | <variable> | :<bindvariable> ]
             [ COMMIT | ROLLBACK ] }

아래와 같이 옵션을 설정하고 s1.sql 파일을 수행해보자. 에러가 발생하면 SQL*Plus가 종료되고 이후 쿼리가 수행되지 않는 것을 확인할 수 있다.

-- 5
WHENEVER SQLERROR EXIT 1 ROLLBACK

@s1

CREATE TABLE t1_t AS SELECT * FROM t1
             *
1행에 오류:
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options에서 분리되었습니다.

에러가 발생한 구문은 SET ERRORLOGGING 명령어을 통해 로깅할 수 있다.

-- 6
SET ERRORL[OGGING] {ON | OFF} [TABLE [schema.]tablename] [TRUNCATE] [IDENTIFIER identifier]


테스트를 위해 아래와 같이 에러 로그 테이블을 생성하자.

-- 7
DROP TABLE sperrorlog PURGE;

CREATE TABLE sperrorlog (
    username   VARCHAR(256)
  , timestamp  TIMESTAMP
  , script     VARCHAR(1024)
  , identifier VARCHAR(256)
  , message    CLOB
  , statement  CLOB);

아래와 같이 SET ERRORLOGGING 명령어를 수행한 후 s1.sql 파일을 수행해보자.

-- 8
WHENEVER SQLERROR EXIT 1 COMMIT

SET ERRORLOGGING ON IDENTIFIER i1

@s1

CREATE TABLE t1_t AS SELECT * FROM t1
             *
1행에 오류:
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options에서 분리되었습니다.


sperrorlog 테이블을 조회해보면 에러와 관련된 내용을 확인할 수 있다.

-- 9
SELECT * FROM sperrorlog;

USERNAME TIMESTAMP  SCRIPT IDENTIFIER MESSAGE                                            STATEMENT
-------- ---------- ------ ---------- -------------------------------------------------- -------------------------------------
TUNA     2050-01-01 s1.sql i1         ORA-00955: 기존의 객체가 이름을 사용하고 있습니다. CREATE TABLE t1_t AS SELECT * FROM t1

1개의 행이 선택되었습니다.


'Oracle > SQL*Plus' 카테고리의 다른 글

VARIABLE 명령어 바인딩  (0) 2018.12.01
Posted by 정희락_