VIEW, Sequence

부트캠프(END)/Oracle|2022. 7. 1. 16:08

VIEW

한 개 이상의 테이블을 합쳐서 만든 가상 테이블.

SELECT를 통해 데이터를 얻은 최종 결과로, 일반 테이블처럼 사용이 가능하다.

복잡한 쿼리를 저장해 놓고 필요할 때 쉽게 조회하기 위해서 많이 사용한다.

--뷰는 일반 계정(사용자 계정)에는 뷰를 생성하는 권한이 없다.
GRANT CREATE VIEW TO user_name --권한 부여
REVOKE CREATE VIEW FROM user_name --권한 취소

--일반 생성
CREATE VIEW view_name
AS SELECT ...

--생성/수정
CREATE OR REPLACE VIEW view_name
AS SELECT ...

--삭제
DROP VIEW view_name

--만들고 나면 일반 테이블처럼 동일하게 쓸 수 있다.
SELECT *
FROM view_name

READ ONLY로 지정해 주지 않으면 INSERT 등으로 원본 테이블에 영향을 줄 수 있다.

CREATE VIEW view_table_readonly
AS SELECT ... WITH READ ONLY

VIEW가 어떤 쿼리로 이루어져 있는지 확인이 가능하다.

*단, VIEW의 이름은 다 대문자로 적어 주어야 한다!

SELECT text FROM user_views WHERE view_name = 'VIEW_NAME'

 

Sequence(자동 증가 번호)

PRIMARY KEY로서 처리를 많이 한다.

각 데이터가 갖는 고유번호를 지정하는 데에 많이 사용한다.

 

1. 시퀀스 생성

중복된 이름을 부여하지 않는다. (에러 발생함)

보통 테이블명_증가할컬럼명_seq 와 같이 쓴다.

CREATE SEQUENCE tableName_columnName_seq
	START WITH 1  --시작값
	INCREMENT BY 1 --증가값
	NOCACHE --
	--최대값을 지정하면 다시 초기값으로 돌아온다. 보통 id로 사용할 때는 NOCYCLE 옵션을 사용함
	NOCYCLE;

2. 시퀀스 삭제

DROP SEQUENCE seqName;

3. 시퀀스 읽기 

SELECT seqName.currval --현재 가진 값 확인 가능
FROM dual;

 

currval : 현재 sequence의 값 조회

nextval : 현재 sequence에서 increment만큼 증가시킨다.

 

 

시퀀스, VIEW 예제

--테이블 생성
CREATE TABLE student(
	sno NUMBER,
	name VARCHAR2(34) CONSTRAINT std_name_nn NOT NULL,
	kor NUMBER(3),
	eng NUMBER(3),
	math NUMBER(3),
	CONSTRAINT std_sno_pk PRIMARY KEY(sno),
	CONSTRAINT std_kor_ck CHECK(kor>=0),
	CONSTRAINT std_eng_ck CHECK(eng>=0),
	CONSTRAINT std_math_ck CHECK(math>=0)
	);

--sno(학생 고유번호)는 자동 증가 번호로 만들어보자
CREATE SEQUENCE std_sno_seq 
	START WITH 1 
	INCREMENT BY 1
	NOCACHE
	NOCYCLE;

--총점, 평균, 등수까지 볼 수 있는 VIEW 생성
CREATE OR REPLACE VIEW student_view
AS SELECT sno, name, eng, kor, math, 
	(kor+eng+math) AS total,
	round((kor+eng+math)/3.0,2) AS avg,
	RANK() OVER(ORDER BY (kor+math+eng) DESC) AS srank
	FROM student WITH READ ONLY;

--데이터 저장
INSERT INTO student VALUES(std_sno_seq.nextval, 'kimdoodoo',80,95,67);
INSERT INTO student VALUES(std_sno_seq.nextval, 'parkpoopoo',91,95,97);
INSERT INTO student VALUES(std_sno_seq.nextval, 'leelooloo',25,53,16);
INSERT INTO student VALUES(std_sno_seq.nextval, 'jungjoojoo',98,78,59);
INSERT INTO student VALUES(std_sno_seq.nextval, 'baebooboo',45,64,98);
INSERT INTO student VALUES(std_sno_seq.nextval, 'shimsoosoo',0,25,79);

 

 

+페이지네이션

int page; //입력받을 페이지값
int i = 0; //10개씩 나눠줄 것
int j = 0; //while 돌아가는 횟수
int rowSize = 10;
int pageCnt = (page * rowSize) - rowSize;

while (rs.next()) {
    if (i < rowSize && j >= pageCnt) {
        BooksVO vo = new BooksVO();
        vo.setNo(rs.getInt(1));
        vo.setTitle(rs.getString(2));
        list.add(vo);
        i++;
    }
    j++;
}

'부트캠프(END) > Oracle' 카테고리의 다른 글

INDEX  (0) 2022.07.04
JDBC 예제(JOIN 데이터 불러오기)  (0) 2022.06.30
JDBC 예제(CURD 게시판)  (0) 2022.06.29

댓글()