by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

10장. SQL DDL




SQL 구문별 상세 설명 - DDL( Data Definition Language )

DDL.?

  • 데이터베이스의 구조나 스키마를 가진 오브젝트를 다루는( 생성, 삭제, 변경 등 ) 데이터베이스 언어다
  • 오라클에서 이용하는 DDL의 종류는 데이터베이스 버전별로 차이가 있지만, DDL 문장 수만 60개가 넘는다
  • 오라클의 주요 오브젝트( 데이터베이스, 데이터파일, 테이블 스페이스, 테이블 뷰 )를 ERD로 표현하면 다음과 같다.

데이터 베이스를 다루기 위한 핵심적인 DDL 문장을 설명한다.

  • 테이블 스페이스 관리
  • 테이블 관리
  • 뷰 관리

테이블 스페이스 관리

  • 테이터베이스에서 테이블 스페이스( Tablespace ) 각종 오브 젝트( 테이블, 뷰, 인텍스, 시퀸스 )를 저장하는 공간이다.
  • 앞의 테이터베이스 ERD에서 서명했듯이 하나의 테이블 스페이스는 한 개나 그 이상의 테이터 파일로 구성된다.

테이블 스페이스의 특징

  • 공간 관리, 테이터의 사용 가능 관리, I/O 성능 개선, 경합 감소, 부분 백업 등에 사용
  • 하나 이상의 파일로 구성
  • DB 실행 동안 온라인 될 수 있다.
  • 시스템 테이블 스페이스나 활동 롤백 세그먼트를 갖는 테이블 스페이스를 제외하고 오프라인 될 수 있다.
  • 읽기 - 쓰기 또는 읽기-전용으로 변경될 수 있다.
  • 데이터베이스는 최소 하나의 테이블 스페이스로 구성( System )
[그림 10 - 22] 테이블 스페이스 생성 스크립트

CREATE TABLESPACE tablespace
  DATAFILE filesec [, filespce]...
  [AUTOEXTEND filespec [ filespec] [ON | OFF]
  [NEXT integer [K | M]]
  [MAXSIZE [UNLIMITED | integer [ K | M ]]
  [DEFAULT Storage storage_clause]
  [ONLINE | OFFLINE
   

|
  • tablespace : 생성하고자 하는 테이블 스페이스명을 기술한다.
  • filespec : 시스템 디렉토리에 만들고자 하는 테이터파일명을 기술한다. 데이터파일은 여러 개를 기술할 수 있다.
  • AUTOEXTEND : 해당 데이터파일의 용량이 모두 사용되면 데이터파일의 크기를 자동으로 증가 시킨다.
  • STORAGE : 테이블 스페이스의 저장 옵션을 지정한다.
  • Online / OFFLINE : 테이블 스페이스를 사용할 것인지 사용하지 않을 것인지 지정한다.

(1) 테이터파일 및 테이블 스페이스 생성


  CREATE TABLESPACE TS_TEST01
    DATAFILE '/ORA08/ORADATA/DB1/DF_TEST.dbf' SIZE 500M
    DEFAULT STORAGE(
    INITIAL 50K
    NEXT 50K
    MINEXTENTS 10
    MAXEXTENTS 50
    PCTNCREASE 0);

테이블 스페이스에서 데이터파일의 이용 현황을 조회하는 방법


SQL> SELECT TABLESPACE_NAME, FILE_NAME, BYTES
  2    FROM DBA_DATA_FILES
  3  ORDER BY TABLESPACE_NAME, FILE_NAME;

TABLESPACE_NAME FILE_NAME                                                   BYTES
--------------- -------------------------------------------------- --------------
EXAMPLE         /usr/local/oracle/oradata/luxtv/example01.dbf           104857600
JBS             /usr/local/oracle/oradata/luxtv/jbs.dbf                1073741824
JBS_LOG         /usr/local/oracle/oradata/luxtv/jbs_log_01             1073741824
JLIVE01         /usr/local/oracle/oradata/luxtv/jlive01.dbf           10615783424
JSEARCH01       /usr/local/oracle/oradata/luxtv/jsearch01.dbf          1073741824
LOG_JLIVE01     /usr/local/oracle/oradata/luxtv/log_jlive01.dbf        1073741824
MRPCTS01        /usr/local/oracle/oradata/luxtv/MRPCTS01.dbf            104857600
SYSAUX          /usr/local/oracle/oradata/luxtv/sysaux01.dbf            618659840
SYSTEM          /usr/local/oracle/oradata/luxtv/system01.dbf            545259520
UA              /usr/local/oracle/oradata/luxtv/ua.dbf                 6316621824
UA2             /usr/local/oracle/oradata/luxtv/ua2.dbf                1073741824

TABLESPACE_NAME FILE_NAME                                                   BYTES
--------------- -------------------------------------------------- --------------
UA_LOG          /usr/local/oracle/oradata/luxtv/log_01.dbf             1073741824
UNDOTBS1        /usr/local/oracle/oradata/luxtv/undotbs01.dbf          4110417920
USERS           /usr/local/oracle/oradata/luxtv/users01.dbf               5242880

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



테이블 스페이스의 변경 ( ** 기호 없음 - 반드시 존재, [] - 선택, | -OR 관계, {} - 한 개 필수, () - 한 개 이상 필수, ... - 연속 )

[그림 10 - 23] 테이블 스페이스 변경

ALTER TABLESPACE tablespace
  DATAFILE filespec [, filespec ]...
  [AUTOEXTEND FILESPEC [filespec] [ON | OFF]]
  [NEXT integer [K | M]]
  {MAXSIZE [UNLIMITED | integer [K | M] }
  [DEFAULT STORAGE storage+clause]
  [ONLINE | OFFLINE]

|
  • tablespace : 변경하고자 하는 테이블 스페이스명을 기술한다.
  • filespec : 시스템 디렉토리에 만들고자 하는 테이터파일명을 기술한다. 테이터파일은 여러 개를 가술할 수 있다.
  • filename : 이미 존해하는 데이터파일의 이름을 다른 이름으로 변경한다.

테이블 스페이스에서 테이터파일 변경

100M 추가

ALTER TABLESPACE TS_TEST01T
  ADD DATAFILE '/ORA8/ORADATA/DB1/DF_TEST02.dbf' SIZE 100M
  DEFAULT STORAGE (INITIAL 10K
                     NEXT 10K
		     MINEXTENTS 5
		     MAXEXTENTS 5
		     PCTINCREASE 0 )

|
변경

ALTER TABLESPACE TS_TEST01
RESIZE DATAFILE '/ORA8/ORADATA/DB1/DF_TEST02.dbf' SIZE 1G

|

테이블 스페이스의 삭제

  • 테이블 스페이스를 한번 삭제하면 그 안에 있는 내용을 복구할 수 없다.
  • 반드시 삭제가 필요한 경우인지 확인하고 삭제하며 만일을 위해서 데이터는 백업을 받고 삭제하도록 한다.
삭제

DROP TABLESPACE tablespace
  [ INCLUDING CONTENTS [CASCADE CONSTRAINTS]]

|
  • tablespace : 삭제하고자 하는 테이블 스페페이스명을 기술한다.
  • INCLUDING CONTENTS : 테이블 스페이스 내에 존재하는 모든 ( 테이블, 인덱스 등)도 같이 삭제된다.
  • CASCADE CONSTRAINTS : 다른 테이블 스페이스와 연결된 참조 무결성도 같이 삭제된다.
  • DBA_DATA_FILES : 데이터 사전에서 데이터파일이 사용중인 조회한 수 존재하지 않으면 삭제도록한다.
    만약 계속 사용중인 데이터파일을 삭제한다면 데이터베이스가 정상적으로 운영된다 하더라도 삭제된 데이터파일에서 데이터를 검색하면 에러가 발생한다.
    또한 데이터베이스르 종료시켰다가 다시 기동하면 데이터파일 깨짐 에러가 발생한다.

테이블 스페이스와 데이터파일 삭제

테이블 스페이스 삭제 와 데이터파일 삭제

1) DROP TABLESPACE TS_TEST01;
2) /ORA8/ORADATA/DB1 디렉토리에서 DF_TEST01.DBF 파일 삭제

|

테이블 관리

  • 테이블 : 테이블스페이스에 생성되고 각 테이블마다 별도의 저장 옵션을 부여할 수 있다.
    테이블마다 용량을 지정할 수 있으나 테이블 스페이스에서 확보한 저장 공간 용량을 초과할 수없다.
    생성, 변경 삭제가 가능하고 테이블 내 컬럼에 NULL 값의 허용 여부와 기본값을 지정할 수 있다.
    또한 PK를 지정할 수 있고 다른 테이블과 참조 무결성 관계를 지정한다.

테이블 생성

테이블 생성

CREATE TABLE [schema.]table
	(	{ column datatype [DEFAULT expr] [column_constraint] ...
		| table_constraint}
	[,	{ column datatype [DEFAULT expr] [column_constraint] ...
		| table_constraint} ]...)
	[	|PCTFREE integer] [PCTUSER integer]
		[INITRANS integer] [MAXTRANS integer]
		[TABLESPACE tablespace]
		[STORAGE storage_clause]
		[  PARALLEL (	[DEGREE { integer | DEFAULT } ]
				[ INSTANCES { integer | DEFAULT } ] )
		| NOPARALLEL ]
	[ CACHE | NOCACHE ]
	| {CLUSTER cluster (column [, column] ...)] ]
	[ ENABLE enable_clause
	| DISABLE disable_clause ] ...
	{ AS subquery]


|
  • table : 생성하고자 하는 테이블명을 기술한다.
  • column : 컬럼명을 기술한다.
  • datatype: 컬럼의 데이터타입을 기술한다.
  • DEFAULT : 기본값을 지정한다.
  • column_constraint : PK, FK를 기술한다.
  • STORAGE : 테이블의 저장 옵션을 지정한다.
  • PARALLEL : CPU가 여러 개인 OS에서 오라클이 쿼리(query)를 실행할 때 초기 파라미터에
    PARALLEL_THREADS_PER_CPU 1보다 크게 설정되어 있으면 병렬로 여러 개의 CPU를 이용할것인지 지정한다.
    이용할 경우 쿼리 속도는 빨라진다.

(1) 테이블 생성

[예제] 다음 모델을 이용하여 제품 테이블을 생성하는 DDL 문장을 작성하라( PK는 ITEMCD고, 테이블 스페이스는 TS_TEST01, INITIAL : 10M, NEXT: 1M, PCTINCREAS: 0이다.)

그림 10-25( p. 459 )

1) PRIMARY KEY를 개별 컬럼에서 지정
	CREATE  TABLE ITEM (
		ITEMCD	VARCHAR2(10)	PRIMARY KEY,
		ITEMNM	VARCHAR2(20)	NULL,
		QTY	NUMBER(10)	NULL,
		PRICE	NUMBER(10)	DEFAULT 0 NULL,
		COLOR	VARCHAR2(10)	NULL,
		MADEDATE	DATE	NULL	
	) TABLESPACE TS_TEST01
	STORAGE( INITIAL 10M NEXT 1M MINEXTENTS 0);

2) PRIMARY KEY를 컬럼 끝에 지정
	CREATE  TABLE ITEM (
		ITEMCD	VARCHAR2(10)	NOT NULL,
		ITEMNM	VARCHAR2(20)	NULL,
		QTY	NUMBER(10)	NULL,
		PRICE	NUMBER(10)	DEFAULT 0 NULL,
		COLOR	VARCHAR2(10)	NULL,
		MADEDATE	DATE	NULL,
		CONSTRAINT ITEM_PK PRIMARY KEY( ITEMCD )
	) TABLESPACE TS_TEST01
	STORAGE( INITIAL 10M NEXT 1M MINEXTENTS 0);

|
  • TABLESPACE, STORAGE를 생략하면 사용자에게 할당한 기본 테이블 스페이스에 테이블이 생성된다.
  • NULL 허용 여부를 지정하지 않은 경우에는 기본적으로 NULL로 지정한다.

(2) FOREIGN KEY 지정


1) USER_CODE 테이블 생성
	CREATE TABLE USER_CODE (
		ITEMCD		VARCHAR2(10) NOT NULL,
		ITEMNM		VARCHAR2(20) NULL
		CONSTRAINT ITEM_PK PRIMARY KEY( ITEMCD )
	);

2) ITEM 테이블 생성
	CREATE TABLE ITEM (
		ITEMCD		VARCHAR2(10) NOT NULL,
		QTY		NUMBER(10) NULL,
		PRICE		NUMBER(10) DEFAULT 0 NULL,
		COLOR		VARCHAR2(10) NULL,
		MADEDATE	DATE	NULL,
		CONSTRAINT	ITEM_PK PRIMARY KEY( ITEMCD ),
		CONSTRAINT	ITEM_FK FOREIGN	KEY( ITEMCD ) REFERENCES
		USER_CODE( ITEMCD )
	);

테이블 변경

  • 컬럼의 데이타 타입, 기본값, NULL 허용 등을 바꿀 때 많이 이용한다.
  • 신규 컬럼을 추가할 수 있으나 컬럼명을 바꿀 수는없다.
  • 테이블 컬럼의 순서는 바꿀 수 없다. 순서를 바꾸기 위해서는 테이블을 DROP했다가 재생성해야한다.
  • 만약 데이터가 있다면 테이터를 임시 테이블이나 컨트롤 파일에 백업하였다가 다시 입력하다록한다.
    이때 컬럼이 재생성되므로 해당 컬럼은 테이블의 맨 마지막에 나타나낟.

ALTER TABLE [schema.]table
  [ADD ( { column datatype [DEFAULT expr] [column_constraint] ...
	 | table_constraint}
       | ( { column datatype [DEFAULT expr] [column_constraint] ...
         | table_constraint}
	 [, { column datatype [DEFAULT expr] [column_constraint] ...
       | table_constraint} ] ... ) } ]
  [MODIFY {  column [datatype] [DEFAULT expr] [column_constraint] ...
          | (column [datatype] [DEFAULT expr] [column_constraint] ...
[, column datatype [DEFAULT expr] [column_constraint] ...] ...) } ]
  [PCTFREE integer] [PCTUSED integer]
  [INITRANS integer] [MAXTRANS integer]
  [STORAGE storage_clause]
  [DROP drop_clause] ...
  [ALLOCATE EXTENT [( [SIZE inter [K|M] ]
                   [DATAFILE 'filename']
		   [INSTANCE integer] )]
  [ PARALLEL ( [ DEGREE    { integer | DEFAULT } ]
               [ INSTANCES { integer | DEFAULT } ]
	      )
  [ NOPARALLEL ]
  [ CACHE | NOCACHE ]
  [ ENABLE enable_clause
  [ DISABLE disable_clause ] ...

(1) 테이블 변경


1) ITEMNM 컬럼 NOT NULL로 변경
   ALTER TABLE ITEM
        MODIFY ( ITEMNM VARCHAR2(40) NOT NULL );

2) ITEMCLCD 컬럼 추가
   ALTER TABLE ITEM
           ADD( ITEMCLCD VARCHAR2(20) DEFAULT '01' NULL );	 

(2) 테이블 컬럼 변경


1) PRIMARY KEY 삭제( DROP )
   ALTER TABLE ITEM
          DROP PRIMARY KEY;

2) PRIMARY KEY 추가
   ALTER TABLE ITEM
           ADD( PRIMARY KEY (ITEMCLCD) );

테이블 삭제 : 테이블 삭제( DROP )는 데이터 삭제( Delete )와 다르게 롤백되지 않음에 유의한다.

[그림 10-28] 테이블 삭제

DROP TABLE [schema.]table 
     [CASCADE CONSTRAINTS]


|
  • 테이블만 삭제할 수도 있고, 테이블이 참조되는 참조 무결성 제약을 삭제할 수도 있다.
  • CASCADE CONSTRAINTS는 자시이참조되는, 즉 FK로 연뎔되어 있는 자식 테이블에 데이터가 있음에도
    자신의 테이블을 삭제할 수 있는 것을 말한다. 연결된 자식 테이블의 데이터를 지우거나 자식 테이블을 삭제하지 않을을 기억하자
  • 참조되는 테이블의 데이터가 있는데, 'DROP TABLE'만 할 경우 참조 무결성 제약 위반 에러가 발생한다.

테이블 삭제


1) FOREIGN KEY에 참조되지 않을 때
    DROP TABLE ITEM;

2) FOREIGN KEY에 참조될 때
    DROP TABLE ITEM CASCADE CONSTRAINTS;

테이블 이름 변경

  • 이미 생성된 테이블의 이름을 바꾼다. 테이블 이름이 바뀌면서 관련된 사전 정보가 바뀌므로 모든 제약 사항은 그대로 유지된다.
    만약 ITEM 테이블이 'ALTER TABLE ORDERITEM ADD( FOREIGN KEY ( ITEMCD ) REFERENCE ITEM );' 라는 문장에 의해 참조 무결성 관계를 가지고 있어도 이름이 변경되면 ITEM -> ITEM1으로 데이터 사전에 수정되어 참조 무결성을 유지한다.
[그림 10-29] 테이블 이름변 경

RENAME old TO new

|
  • old: 변경하고자 하는 오브젝트( 테이블, 뷰, 시퀸스 등)를 기술한다.
  • new: DBMS에서 사용허지 않고 이미 등록되지 않은 새로운 이르을 지정한다.

(1) 테이블 이름 변경


RENAME ITEM TO ITEM1;

뷰 관리

  • 조인이 많이 발생하는 경우
  • 사용자 접근이 필요한 경우
  • 보안이 유지되어야 하는 경우
  • 데이터 무결성을 유지하면서 SQL 문장에 구조를 간단하게 하려는 경우

뷰의 생성( CREATE )

[그림 10-30] 뷰 생성

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view
                    [(alias[alias].)]
AS subsquery
 [WITH CHECK OPTIION [CONSTRATINT constraint]]
 [WITH READ ONLY]


  • CREATE: 뷰를 생성한다.
  • CREATE OR REPLACE: 뷰가 없으면 새로 생성하고 뷰가 있으면 변경한다.
  • view: 생성하고자 하는 뷰의 이름을 기술한다.
  • as subquery: 참조 테이블과 컬럼에 대해서 기술한다.
  • WITH CHECK OPTION: 뷰를 통해서만 INSERT, DELETE, UPDATE가 가능하게 지정한다.
  • WITH READ ONLY: 이 뷰를 통해서는 INSERT, DELETE, UPDATE가 불가능하다.

(1) 뷰 생성


CREATE VIEW V_ORDER AS
SELECT ORDERNO, ITEMCD, ITEMNM, PRICE, QTY
  FROM ORDERITEM
 WHERE PRICE > 10000;

(2) 조인 뷰 생성


CREATE VIEW V_ORDER AS
SELECT A.ORDERNO, A.ORDERDATE, A.CUSTNM, A.ORDERTYPE
     , B.ITEMCD, B.ITEMNM, B.PRICE, B.QTY
  FROM ITEM A, ORDERITEM B
 WHERE A.ORDERNO = B.ORDERNO


(3) 그룹 뷰 생성


CREATE VIEW V_ORDERTYPE_SUM AS
SELECT A.ORDERTYPE, SUM( B.PRICE )
  FROM ITEM A, ORDERITEM B
 WHERE A.ORDERNO = B.ORDERNO
GROUP BY A.ORDERTYPE


뷰 삭제

[그림 10-32] 뷰 삭제

DROP VIEW[SCHEMA.]VIEW

|
주문 뷰( V_ORDER )를 삭제하라

DROP VIEW V_ORDER

|

SQL 구문별 상세 설명 - 트랜잭션 컨트롤

  • 트랜잭션: 논리적인 작업 단위( Logical Unit Of Work )라고 '7장. 트랜잭션 분석'에서 설명했다.
    SQL문장에서 트랜잭션 처리는 테이터베이스에 반영하는 커밋과 롤백단위로 이루어진다.
오라클에서 트랜잭셔을 종료시키는 경우

* 컷밋이나 로백이 실행될 때
* DML 문장이 실행되었고 트랜잭션이 종료되지 않았는데, CRETE, DROP, RENAME, ALTER와 같은 DDL 문장이 실행되는 경우 DML 문장은 자동으로 커밋된다.
* 트랜잭션이 종료되지 않았는데 사용자가 오라클 접속에 빠져나갈 때 트랜잭션은 자동으로 컷민된다.
* 비정상적으로 시스템이 종료되는경우 현 트랜잭션을 롤백된다.

|

트랜잭션 컨트롤 문장 4가지 ( [그림 10-33] 트랜잭션 컨트롤 명령어 )

  • COMMIT : 테이터베이스에 DML 작업 내용르 반영한다.
  • ROLLBACK : 테이터베이스에 DML 작업 내용을 취소한다.
  • SAVEPOINT : 긴 트랜잭션 중간 중간에 롤백을 대비하여 기록한다.
  • SET TRANSACTION : 트랜잭션의 종류를 읽기 전용으로 할 것인지 읽기 / 쓰기로 할 것인지 지정한다.

테이터베이스에 작업 내용르 반영하는 COMMIT

[그림 10-34] COMMIT

COMMIT [WORK]
    [ COMMENT 'text'
    | FORCE 'text'[, integer] }

|

COMMIT 테스트

(1) 세션 1: 주문 테이블의 데이터 건수를 조회한다.


SELECT COUNT(*) FROM ODER;
COUNT(*) : 5건

(2) 세션 2: 주문 테이블의 데이터 건수를 조회한다.


SELECT COUNT(*) FROM ODER;
COUNT(*) : 5건

(3) 세션 1: 주문 테이블에 주문번호-2001, 주문일자- 2002년 9월 1일, 고객명-이유진, 주문형식-인터넷 테이터를 입력해보자


INSERT INTO ODER VALUES( 2001, '20020901', '이유진', '인터넷' );

(4) 세션 1: 주문 테이블의 데이터 건수를 조회한다.

  • COMMIT을 하지 않았지만, 자기 세션에서는 변경 후 데이터가 보인다.

SELECT COUNT(*) FROM ODER;
COUNT(*) : 6건

(5) 세션 2: 주문 테이블의 데이터건수를 조회한다.

  • COMMIT을 하지 않았으므로 변경 전 데이터가 보인다.
    
    SELECT COUNT(*) FROM ODER;
    COUNT(*) : 5건
    
    

(6) 세션 2: COMMIT 명령어를 실행한다.


COMMIT;

(7) 세션 1: 주문 테이블의 테이터 건수를 조회한다.


SELECT COUNT(*) FROM ODER;
COUNT(*) : 6건

(8) 세션 2: 주문 테이블의 테이터 건수를 조회한다.

  • COMMIT했으므로 변경 후 데이터가 보인다.
    
    SELECT COUNT(*) FROM ODER;
    COUNT(*) : 6건
    
    

데이터베이스에 작업 내용을 취소하는 ROLLBACK

ROLLBACK문자으이 구성은 다음과 같다.


ROLLBACK [WORK]
	[ TO [SAVEPOING] savepoint
	| FORCE 'text' ]

ROLLBACK 테스트

[예제] 앞의 COMMIT 테스트 (6)에서 ROLLBACK을 실행한다.

(6) 세션 2: Rollback 명령어를 실행한다.


ROLLBACK;

(7) 세션 1: 주문 테이블의 데이터 건수를 조회한다.

  • ROLLBACK하였으므로 변경 전 데이터가 보인다.

SELECT COUNT(*) FROM ODER;
COUNT(*) : 5건

(8) 세션 2: 주문 테이블의 데이터 건수를 조회한다.

  • ROLLBACK하였으므로 아무런 변화도 없다.

SELECT COUNT(*) FROM ODER;
COUNT(*) : 5건

긴 트랜잭셔늘 나누는 SAVEPOINT

그림 10-36 SAVEPOINT

SAVEPOINT savepoint

|

SAVEPOINT 테스트

[예제] SAVEPOINT가 트랜젹션을 제어하는 것을 테스트해보자.

(1) 주문 테이블의 데이터 건수를 조회한다.


SELECT COUNT(*) FROM ODER;
COUNT(*) : 5건

(2) 주문 테이블에 주문번호-2001, 주문일자- 2002년 9월 1일, 고객명-이유진, 주문형식-인터넷 테이터를 입력해보자


INSERT INTO ODER VALUES( 2001, '20020901', '이유진', '인터넷' );

(3) SAVEPOINT 'A'를 지정한다.


SAVEPOINT A;

(4) 주문 테이블에 주문번호-2003, 주문일자- 2002년 12월 1일, 고객명-김철, 주문형식-방문테이터를 입력해보자


INSERT INTO ODER VALUES( 2003, '20021201', '김철', '방문' );

(5) 주문 테이블의 데이터 건수를 조회한다.


SELECT COUNT(*) FROM ODER;
COUNT(*) : 7건

(6) ROLLBACK TO A를 실행한 후 COMMIT을 입력한다.


ROLLBACK TO A;
COMMIT;

(7) 주문 테이블의 데이터 건수를 조회한다.

데이터가 한 건 입력된 지점에 SAVEPOINT 'A' 가 지정되어 있었으모로 초기 데이터 건수 5건에 1건을 더하여 6건이 되었다.


SELECT COUNT(*) FROM ODER;
COUNT(*) : 6건

트랜잭션을 읽기 전용으로 할 것인지 읽기 / 쓰기로 할 것인지 지정하는 SET TRANSACTION

그림 10-37 SET TRANSACTION

SET TRANSACTION
    { READ ONLY
    | READ WRITE
    | USE ROLLBACK SEGMENT rollback_segment }

SET TRANSACTION 테스트

[예제] 오라클 데이터베이스의 PL/SQL 문장을 만들어 테스트해보자.

(1) 다음 주문 테이블의 데이터 건수를 조회하는 PL/SQL 문장을 실행해보자.

  • READ ONLY이므로 SELECT COUNT문장이 정상적으로 수행된다.

DECLARE
  RCNT NUMBER;
BEGIN
  SET TRANSACTION READ ONLY;
  SELECT COUNT(*) INTO RCNT FROM ITEM;
  COMMIT;
END;

(2) 다음 주문 테이블의 데이터 건수를 조회하는 PL/SQL 문장을 실행해보자.

  • READ ONLY 이므로 에러발생( READ ONLY 트랜잭션은 삽입/삭제/갱신할 수 없습니다 )

DECLARE
  RCNT NUMBER;
BEGIN
  SET TRANSACTION READ ONLY;
  SELECT COUNT(*) INTO RCNT FROM ITEM;
  DELETE FROM ITEM;
  COMMIT;
END;

SQL 구문별 상세 설명 - 세션 컨트롤

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.