11. SEQUENCE와 SYNONYM(동의어) _ 실습해보고다시정리
[기타SQL]/oracle SQL 2014. 9. 3. 20:36 |11장. SEQUENCE와 SYNONYM(동의어)를 배웁니다.
1. SEQUENCE (시퀀스)
: 은행의 번호표처럼 연속적인 일련 번호를 만들어주는 기능. (연속적으로 증가하거나, 연속적으로 감소)
* 문법
CREATE SEQUENCE sequence_name (cache는 미리 번호를 뽑아놔서 시퀀스의 생성속도를 개선하는 것이므로 꼭 써야함.)
|
*면접tip
- 시퀀스가 롤백이 되느냐? : 시퀀스는 롤백이 되지 않는다. (은행 번호표를 다시 집어 넣을 수 없듯이)
- cache : 작업이 한꺼번에 몰려왔을 때를 대비해서 미리 저장해두는 것.
( 은행을 예를들면, 사람이 한꺼뻔에 몰려왔을 때를 대비해서 번호표를 미리 다 뽑아놓고, 사람들 들어오면 바로바로 주는 것.)
1) SEQUENCE 생성 및 옵션 확인하기
Step 1: 예제로 사용할 jumun 테이블을 아래와 같이 생성하고 데이터를 입력.
SCOTT>CREATE TABLE jumun
2 ( j_no number(4) ,
3 j_name varchar2(10)) ;
Step 2. 데이터를 입력합니다.
이때 SEQUENCE 를 어떻게 활용해서 데이터를 입력하는지 잘 보세요.
SCOTT>INSERT INTO jumun |
이 예에서 볼 수 있듯이
SEQUENCE 의 사용법은
“SEQUENCE이름.함수” 입니다.
NEXTVAL 이란 함수는 현재
값의 다음 값을 가져오라는 함
수라서 계속 값이 증가함을 볼
수 있습니다.
Seq_jumun_no.CURRVAL 값을 조회하니까 현재 SEQUENCE 에서 발생한 마지막 값을 볼 수 있습
니다.
Step 3. MAXVALUE / MINVALUE 항목과 CYCLE 값을 테스트 합니다.
이번에는 MAXVALUE 값만큼 다 사용을 할 경우 어떻게 되는지 와 CYCLE 항목과 MINVALUE 항
목이 어떤 의미인지 살펴보겠습니다.
SCOTT> BEGIN 11건의 데이터가 모두 입력되고 SEQUENCE 번호도 1000 – 1010번 까지 모두 소진되었습니다.
SCOTT>INSERT INTO jumun
|
위 테스트에서 알 수 있듯이 MAXVALUE 값을 다 사용한 상태에서 CYCLE 로 설정이 되면 다시
돌아가는 데 그 시작번호는 MINVALUE로 설정된 값임을 알 수 있습니다.
Step 4. NOCYCLE 설정과 CACHE 설정을 테스트 합니다.
이 실습을 하기 위해 SEQUENCE 와 테이블을 하나씩 더 생성하겠습니다.
SCOTT>CREATE TABLE jumun2 |
데이터를 1건 만 입력한 후 데이터베이스를 강제 종료하겠습니다.
CACHE 속성으로 인해 캐싱된 Sequence 번호는 서버가 종료되면 모두 손실되는 문제가 있습니다.
이번 실습에서 DB를 강제 종료 하는 이유는 2 개의 번호를 (100,101) 캐싱한 후 100 번은 사용
하고 101 번을 사용하지 않은 상태에서 DB 를 강제종료 시켜 정말 손실되는지 테스트를 하기 위
함입니다.
SCOTT>INSERT INTO jumun2
SYS>CONN scott/tiger 100 AAAA
원래 101 번이 입력되어야 하지만 시퀀스 생성할 |
Seq_jumun2_no 시퀀스는 생성될 때 CYCLE 라는 옵션을 주지 않았습니다. 이 옵션을 주지 않고
생성하면 기본값은 NOCYCLE 입니다.
아래와 같이 MAXVALUE 를 초과하여 값을 요청하면 에러를 발생하게 됩니다.
SCOTT>INSERT INTO jumun2
|
2) 값이 감소하는 SEQUENCE 생성 및 사용하기
SCOTT>CREATE SEQUENCE s_rev
2 INCREMENT BY -1
3 MINVALUE 0
4 MAXVALUE 10
5 START WITH 5 ;
Sequence created.
SCOTT>INSERT INTO s_test1 VALUES (s_rev.NEXTVAL);
1 row created.
SCOTT>/
1 row created.
SCOTT>/
1 row created.
SCOTT>/
1 row created.
SCOTT>/
1 row created.
SCOTT>/
1 row created.
SCOTT>/
insert into s_test1 values (s_rev.nextval)
*
ERROR at line 1:
ORA-08004: sequence S_REV.NEXTVAL goes below MINVALUE and cannot be instantiated
SCOTT>SELECT * FROM s_test1;
NO
----------------
5
4
3
2
1
0
6 rows selected.
위 실습으로 감소하는 시퀀스를 생성하고 사용하는 방법을 살펴 보았습니다.
3) Sequence 초기화 하기
일반적으로 Sequence 는 초기화 하는 경우도 드물지만 정말 업무상 반드시 초기화를 해야 할 경
우도 있습니다. 그런 경우에는 아래와 같이 프로시저를 생성해서 수행하면 됩니다.
아래 프로시저를 참고하세요.
================================================================
SCOTT> CREATE OR REPLACE PROCEDURE re_seq
2 (
3 SNAME IN VARCHAR2
4 )
5 IS
6 VAL NUMBER;
7 BEGIN
8 EXECUTE IMMEDIATE 'SELECT ' || SNAME || '.NEXTVAL FROM DUAL ' INTO VAL;
9 EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SNAME || ' INCREMENT BY -' || VAL || ' MINVALUE 0';
10 EXECUTE IMMEDIATE 'SELECT ' || SNAME || '.NEXTVAL FROM DUAL ' INTO VAL;
11 EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SNAME || ' INCREMENT BY 1 MINVALUE 0';
12 END;
13 /
Procedure created.
SQL> CREATE SEQUENCE seq_test; <---- 테스트용 시퀀스를 생성합니다.
Sequence created.
SQL> select seq_test.nextval from dual;
NEXTVAL
------------
1
SQL> /
NEXTVAL
------------
2
SQL> /
NEXTVAL
------------
3
SQL> /
NEXTVAL
------------
4
SQL> /
NEXTVAL
------------
5 <- 마지막 추출된 값이 5 입니다.
SQL> EXEC re_seq('SEQ_TEST'); <- 시퀀스 이름을 꼭 홑따옴표 안에 대문자로 쓰세요.
PL/SQL procedure successfully completed.
SQL> select seq_test.currval from dual;
CURRVAL
----------------
0 <--- 초기화 된 것이 확인됩니다.
4)SEQUENCE 조회 및 수정하기
위에서 생성한 seq_jumun2_no 시퀀스를 조회 한 후 최대값을 110 번으로 하고 CACHE 값을 5로
수정하겠습니다.
먼저 현재 생성되어 있는 SEQUENCE 내용을 조회하겠습니다.
SCOTT>COL 이름 FOR a15 ;
|
SEQUENCE 를 변경할 때 START WITH 값은 변경이 안 됩니다.
5) SEQUENCE 삭제하기
SCOTT>DROP SEQUENCE seq_jumun2_no ;
SEQUENCE를 사용하는 DML이 ROLLBACK 되어도 SEQUENCE는 다시 ROLLBACK 되지 않기 때문
에 만약 이럴 경우 입력되는 번호의 차이가 생길 수 있다는 점도 꼭 기억하시길 바랍니다.
2. SYNONYM (동의어) : 테이블에 붙이는 별명 (보안상 목적이나 사용자의 편의성 때문)
1) 문법
CREATE [PUBLIC] SYNONYM synonym이름
|
- PUBLIC : 다른 사용자도 다 쓸 수 있게 생성 (대부분 PUBLIC으로 만든다.)
- CREATE SYNONYM 이라는 권한이 필요하므로 권한을 먼저 할당 해야 한다.
SCOTT>CONN / AS SYSDBA
|
2) 생성 예
(1) Scott 사용자의 emp2 테이블의 동의어를 e2 로 생성하세요.
SCOTT>CREATE SYNONYM e2 FOR emp2 ;
(2) Scott 사용자의 department 테이블의 동의어를 d2 로 생성하되 모든 사용자들이 사용 할 수 있도록 생성.
SCOTT>CREATE PUBLIC SYNONYM d2 FOR department ;
(3) SYNONYM 조회하기
SCOTT>SELECT synonym_name, table_owner , table_name
2 FROM user_synonyms
3 WHERE table_name='EMP2' ;
SYNONYM_NAME TABLE_OWNER TABLE_NAME
--------------------- -------------------- ------------------
E2 SCOTT EMP2
(4) SYNONYM 삭제하기
SCOTT>DROP SYNONYM e2 ;
---------------------------------------------------------------------------------------
<면접>
* 시퀀스번호를 뽑고 롤백을하면 시퀀스는 롤백되지않고, 이미 뽑히면 끝이다!
* dba는 PLSQL을 꼭배워야됨.
'[기타SQL] > oracle SQL' 카테고리의 다른 글
12. 계층형쿼리 (Hierarchical Query) -연습문제다시풀어보자. (0) | 2014.09.03 |
---|---|
10. 서브쿼리(Sub Query) (0) | 2014.09.02 |
9. VIEW(뷰) _ 연습문제 다시 풀어볼 것. (0) | 2014.09.02 |
8. INDEX(인덱스) ★★★ (0) | 2014.09.01 |
7. 제약조건 ★★★ (0) | 2014.08.28 |
6. DML (Data Manipulation Language) (0) | 2014.08.28 |
5. DDL문장과 딕셔너리 (0) | 2014.08.27 |
4. JOIN 기법 (0) | 2014.08.27 |
3. SQL 복수행 함수(그룹함수) _연습문제다시해보기 (0) | 2014.08.26 |
2. SQL 단일행 함수 (0) | 2014.08.24 |