여러분이 테이블을 만들고 일련번호 자동으로 삽입하고자 할 때가 있을 것입니다. 이럴 때는
오라클의 시퀀스라는 객체를 생성해 줘야합니다. 시퀀스는 자동으로 증가하는 숫자를 생성해
주는 객체입니다. 문법은 다음과 같습니다.
CREATE SEQUENCE SEQUENCE_NAME
INCREMENT BY 값
START WITH 값
MAXVALUE 값 / NOMAXVALUE
MINVALUE 값 / NOMINVALUE
CYCLE / NOCYCLE
CACHE 값 / NOCACHE
ORDER / NOODER;
주의해야할 옵션 몇개를 살펴보면 우선 MAXVLAUE/NOMAXVALUE가 잇는데 이 옵션은 시퀀스가 증
가 될 수 있는 최대값을 나타냅니다. MAXVALUE의 기본값은 1024입니다. NOMAXVALUE로 설정하
면 무한대로 값이 올라가게 됩니다. CYCLE이란 옵션은 시퀀스의 최대값에 도달하면 그 다음값
으로 최초의 값이 되는 것입니다. 기본값은 순환하는 값이 아닙니다. CACHE/NOCACHE라는 옵션
은 캐시를 사용하도록 지정하는 것입니다. 이값을 지정하지 않으면 기본적으로 오라클은 20개
의 값을 캐시합니다.
시퀀스 생성을 해보겠습니다..
SQL> CREATE sequence seq_iii
2 increament BY 1
3 start WITH 50
4 maxvalue 100
5 nocache
6 nocycle;
increament BY 1
*
2행에 오류:
ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다
SQL> c /increament BY 1/increment BY 1
2* increment BY 1
SQL> run
1 CREATE sequence seq_iii
2 increment BY 1 -- 1단위로 증가함
3 start WITH 50 -- 50부터 시작하는 시퀀스
4 maxvalue 100 -- 최대값 100
5 nocache
6* nocycle
주문번호가 생성되었습니다.
SQL> SELECT seq_iii.NEXTVAL FROM dual;
NEXTVAL
----------
50
SQL> SELECT seq_iii.currval FROM dual;
CURRVAL
----------
50
SQL> CREATE TABLE seq_test (id number);
테이블이 생성되었습니다.
SQL> CREATE TABLE seq_test (id number);
테이블이 생성되었습니다.
SQL> INSERT INTO seq_test VALUES (seq_iii.NEXTVAL);
1 개의 행이 만들어졌습니다.
SQL> SELECT * FROM seq_test;
ID
----------
51
SQL> -- 테이블 생성시 컬럼에 기본값을 설정해줬다면 INSERT시 다음과 같이 하면됨
SQL> ALTER TABLE STUDENT
2 ADD APPLY DATE DEFAULT SYSDATE;
테이블이 변경되었습니다.
SQL> INSERT INTO STUDENT
2 VALUES ('9655023', '엄성재', '0164506701', DEFAULT);
1 개의 행이 만들어졌습니다.
SQL> -- APPLY 컬럼에 기본값으로 현재 시스템의 날짜를 적용
SQL> SELECT * FROM STUDENT
2 WHERE S_NUM = '9655023';
S_NUM S_NAME S_PHONE APPLY
------- -------- ----------- --------
9655023 엄성재 0164506701 02/05/19
SQL> -- DEFAULT 라는 키워드로 기본값이 들어감을 명시해 주지 않아도 기본값이 들어간다.
SQL> INSERT INTO STUDENT(S_NUM, S_NAME, S_PHONE)
2 VALUES ('9555037', '전호중', '0172204580');
1 개의 행이 만들어졌습니다.
SQL> SELECT * FROM STUDENT
2 WHERE S_NUM = '9555037';
S_NUM S_NAME S_PHONE APPLY
------- -------- ----------- --------
9555037 전호중 0172204580 02/05/19
시퀀스의 변경은 모두 생성문법과 같은데 start WITH문이 없다는 것 뿐입니다. 즉, 이미 생성
당시 시작할 시퀀스의 값이 정해졌기 때문입니다. 삭제는 DROP sequence sequence_name 을 하
면 됩니다.
이제 기본적인 INSERT 문의 사용법을 알았습니다. 상당히 간단하죠? 이제 SELECT 문과 합쳐진
INSERT 문을 실습해보도록 하겠습니다. 먼저 테이블을 하나 생성합니다.
SQL> CREATE TABLE TEMP
2 (EMPNO NUMBER(4) PRIMARY KEY,
3 ENAME VARCHAR2(10),
4 JOB VARCHAR2(9),
5 MGR NUMBER(4),
6 HIREDATE DATE,
7 SAL NUMBER(7,2),
8 COMM NUMBER(7,2),
9 DEPTNO NUMBER(2));
테이블이 생성되었습니다.
SQL> INSERT INTO TEMP
2 SELECT * FROM EMP
3 WHERE DEPTNO = 20;
5 개의 행이 만들어졌습니다.
SQL> SELECT * FROM TEMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7876 ADAMS CLERK 7788 87/05/23 1100 20
7902 FORD ANALYST 7566 81/12/03 3000 20
SQL> -- 이런 방법도 있지용~
SQL> CREATE TABLE TEMP2
2 AS
3 SELECT * FROM EMP
4 WHERE DEPTNO = 10;
테이블이 생성되었습니다.
SQL> SELECT * FROM TEMP2;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 81/06/09 2450 10
7839 KING PRESIDENT 81/11/17 5000 10
7934 MILLER CLERK 7782 82/01/23 1300 10
1111 MILLER CLE%RK 7782 82/01/23 1300 10
이렇게 SELECT 문을 이용해서도 INSERT를 할 수 있습니다. 좀더 복잡한 쿼리문을 써서도 삽입
을 할 수 있겠지요.