VIEW, Sequence
부트캠프(END)/Oracle2022. 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 |
댓글()