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

DDL.?

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

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

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

테이블 스페이스 관리

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

테이블 스페이스의 특징

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

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

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

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

{CODE:SQL}

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);

{CODE}

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

{CODE:SQL}

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 개의 행이 선택되었습니다.

{CODE}

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

그림 10 - 23 테이블 스페이스 변경
{CODE:SQL}

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

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

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

100M 추가
{CODE:SQL}

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 )

{CODE}변경
{CODE:SQL}

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

{CODE}

테이블 스페이스의 삭제

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

DROP TABLESPACE tablespace
[ INCLUDING CONTENTS CASCADE CONSTRAINTS]

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

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

테이블 스페이스 삭제 와 데이터파일 삭제
{CODE:SQL}

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

{CODE}

테이블 관리

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

테이블 생성

테이블 생성
{CODE:SQL}

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]
{CODE}
* 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 )
{CODE:SQL}

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);

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

(2) FOREIGN KEY 지정

{CODE:SQL}

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 )
);

{CODE}

테이블 변경

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

{CODE:SQL}

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 ...

{CODE}

(1) 테이블 변경

{CODE:SQL}

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 );

{CODE}

(2) 테이블 컬럼 변경

{CODE:SQL}

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

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

{CODE}

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

그림 10-28 테이블 삭제
{CODE:SQL}

DROP TABLE [schema.]table
CASCADE CONSTRAINTS

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

테이블 삭제

{CODE:SQL}

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

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

{CODE}

테이블 이름 변경

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

RENAME old TO new

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

(1) 테이블 이름 변경

{CODE:SQL}

RENAME ITEM TO ITEM1;

{CODE}

뷰 관리

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

뷰의 생성( CREATE )

그림 10-30 뷰 생성
{CODE:SQL}

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

{CODE}

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

(1) 뷰 생성

{CODE:SQL}

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

{CODE}

(2) 조인 뷰 생성

{CODE:SQL}

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

{CODE}

(3) 그룹 뷰 생성

{CODE:SQL}

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

{CODE}

뷰 삭제

그림 10-32 뷰 삭제
{CODE:SQL}

DROP VIEW[SCHEMA.]VIEW

{CODE}
주문 뷰( V_ORDER )를 삭제하라
{CODE:SQL}

DROP VIEW V_ORDER

{CODE}

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

  • 트랜잭션: 논리적인 작업 단위( Logical Unit Of Work )라고 '7장. 트랜잭션 분석'에서 설명했다.
    SQL문장에서 트랜잭션 처리는 테이터베이스에 반영하는 커밋과 롤백단위로 이루어진다.
오라클에서 트랜잭셔을 종료시키는 경우
{CODE:SQL}
  • 컷밋이나 로백이 실행될 때
  • DML 문장이 실행되었고 트랜잭션이 종료되지 않았는데, CRETE, DROP, RENAME, ALTER와 같은 DDL 문장이 실행되는 경우 DML 문장은 자동으로 커밋된다.
  • 트랜잭션이 종료되지 않았는데 사용자가 오라클 접속에 빠져나갈 때 트랜잭션은 자동으로 컷민된다.
  • 비정상적으로 시스템이 종료되는경우 현 트랜잭션을 롤백된다.
{CODE}

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

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

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

그림 10-34 COMMIT
{CODE:SQL}

COMMIT WORK
[ COMMENT 'text'

FORCE 'text', integer }
{CODE}

COMMIT 테스트

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

{CODE:SQL}

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

{CODE}

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

{CODE:SQL}

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

{CODE}

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

{CODE:SQL}

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

{CODE}

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

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

{CODE:SQL}

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

{CODE}

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

  • COMMIT을 하지 않았으므로 변경 전 데이터가 보인다.
    {CODE:SQL}

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

{CODE}

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

{CODE:SQL}

COMMIT;

{CODE}

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

{CODE:SQL}

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

{CODE}

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

  • COMMIT했으므로 변경 후 데이터가 보인다.
    {CODE:SQL}

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

{CODE}

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

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

{CODE:SQL}

ROLLBACK WORK
[ TO SAVEPOING savepoint

FORCE 'text' ]

{CODE}

ROLLBACK 테스트

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

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

{CODE:SQL}

ROLLBACK;

{CODE}

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

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

{CODE:SQL}

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

{CODE}

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

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

{CODE:SQL}

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

{CODE}

긴 트랜잭셔늘 나누는 SAVEPOINT

그림 10-36 SAVEPOINT
{CODE:SQL}

SAVEPOINT savepoint

{CODE}

SAVEPOINT 테스트

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

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

{CODE:SQL}

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

{CODE}

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

{CODE:SQL}

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

{CODE}

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

{CODE:SQL}

SAVEPOINT A;

{CODE}

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

{CODE:SQL}

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

{CODE}

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

{CODE:SQL}

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

{CODE}

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

{CODE:SQL}

ROLLBACK TO A;
COMMIT;

{CODE}

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

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

{CODE:SQL}

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

{CODE}

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

그림 10-37 SET TRANSACTION
{CODE:SQL}

SET TRANSACTION
{ READ ONLY

READ WRITE
USE ROLLBACK SEGMENT rollback_segment }

{CODE}

SET TRANSACTION 테스트

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

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

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

{CODE:SQL}

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

{CODE}

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

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

{CODE:SQL}

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

{CODE}

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