학원수업_Oracle

201103 VIEW

logloglog 2020. 11. 3. 15:27

1. VIEW

- 가상의 테이블

- 쿼리가 내보내는 결과가 VIEW 임. 다음거 보려면 사라짐

- 필요한 정보가 여러 테이블에 분산되어 있고 JOIN이 자주 발생되는 경우 매번 JOIN연산 수행대신 뷰를 생성하여 처리

- 특정 자료에 대한 접근을 제한하고자 하는 경우

왜 날라갔을까? 이름이 없어서.. 이름이 없으면 저장이 안됨

자바의 익명클래스 (GUI쓸때 많이씀. 클릭했을때 실행되는것들을 클래스로...왜? 누를때마다만 실행되믄되니까.함수의 매개변수자리에 이름없는 클래스를ㄹ 집어넣는다. )

오라클에서, 셀렉트에 의해서 영향받은 행들의 집합 >커서 >뷰랑비슷

이런것들이 뷰면서 커서인것

뷰는 실시간으로 변형되어지는.. 홈피의 접속자 통계같은거

정규화를 시킬수록 분할이 됨.. 특정 컬럼을 조회하려는데 조회하는 컬럼들잉 고정이 되어잇는데 매번 조인하기 번거로우니까 조인한번 한거를 보관해서 필요할때 따로쓰려고 

*사용형식

CREATE [OR REPLACE] VIEW 뷰이름[(컬럼명),...)]
AS
    SELECT문
    [WITH CHECK OPTION]
    [WITH READ ONLY];

-OR REPLACE' : 동일이름의 뷰가 존재하면 OVER WRITE

- '(컬럼명,...)': 생성되는 뷰에 부여될 컬럼명, 생략하면 원본 테이블의 컬럼명이 사용됨

- 'WITH CHECK OPTION' : SELECT문의 조건에 위배되는 값으로 변경, 삽입될 경우 실행이 거절됨(오류)

- 'WITH READ ONLY' : 읽기 전용 뷰 (INSERT, UPDATE, DELETE)문의 실행 거절) 생략하면 수정가능한 뷰 생성- 원본테이블도 변경

-'WITH CHECK OPTION'과 'WITH READ ONLY'는 같이 사용할 수 없음

 

EX

회원테이블에서 마일리지가 3000이상인 회원의 회원벌호, 회원명, 마일리지를 조회하는 뷰를 생성하시오

CREATE OR REPLACE VIEW V_MEMBER01
AS
    SELECT MEM_ID 회원번호,
        MEM_NAME 회원명,
        MEM_MILEAGE
    FROM MEMBER
    WHERE MEM_MILEAGE>=3000;

SELECT * FROM V_MEMBER01;

 

CREATE OR REPLACE VIEW V_MEMBER01(MID,MNAME,MILE)
AS
    SELECT MEM_ID 회원번호,
        MEM_NAME 회원명,
        MEM_MILEAGE
    FROM MEMBER
    WHERE MEM_MILEAGE>=3000;

이렇게 컬럼명만 더 정해서 덮어쓰면

진현경의 마일리지 변경할거임

UPDATE  V_MEMBER01
SET     마일리지=500
WHERE   회원번호='x001';

컬럼명을 한글로해놔서 이렇게쓴다.

SELECT MEM_NAME,MEM_MILEAGE
FROM MEMBER
WHERE MEM_ID='x001';

원본데이터가 바꼈다!!

그럼 원본데이터를 바꾸면 뷰도 바뀔까?

UPDATE MEMBER
SET     MEM_MILEAGE=9500
WHERE MEM_ID='e001';

 

SELECT * FROM V_MEMBER01;

원본데이터의 이혜나를 바꾼게 뷰도 바꼈다.

WITH CHECK OPTION을 써보자

 

CREATE OR REPLACE VIEW V_MEMBER01
AS
    SELECT MEM_ID 회원번호,
        MEM_NAME 회원명,
        MEM_MILEAGE 마일리지
    FROM MEMBER
    WHERE MEM_MILEAGE>=3000
    
    WITH CHECK OPTION;

진형경을 2700으로 바꿔보자

 

UPDATE V_MEMBER01
    SET  마일리지=2700
    WHERE 회원번호='x001';

INSERT INTO V_MEMBER01
VALUES('a002','김소연',1000);

멤번호랑 이름 마일리지이외에 낫널항목이 있음

 

 

CREATE OR REPLACE VIEW V_LPROD01
AS
    SELECT * FROM LPROD;
INSERT INTO V_LPROD01
VALUES (10,'P501','농산물')

뷰에도 삽입되고
원본테이블에도 해당자료가 삽입되어졌다.

이게 되게 위험한거임 그램서 WITH READ ONLY를 만든것

CREATE OR REPLACE VIEW V_LPROD01
AS
    SELECT * FROM LPROD
    WITH READ ONLY;

이렇게 리드온리 넣어서 다시 만들고

UPDATE V_LPROD01
SET LPROD_NM = '수산물'
WHERE LPROD_ID=10;

 

*테이블과 테이블 사이에 키가 겹치는게없어서 중간테이블이 필요하다? 이때 뷰를 활용한다.

 

 

**뷰 사용시 주의사항

뷰생성시 제약조건이 존재하는 경우 ORDER BY절 사용금지

뷰 생성시 집계함수(GROUP BY), DISTINCT 사용시 DML 명령사용 불가

SELECT 문에 표현식이 사용된 경우 해당 컬럼의 수정 추가 불가

CURRVAL, NEXTVAL 등 의사컬럼(Pseudo column) 사용 불가

ROWID,ROWNUM, LEVEL등 의사컬럼 사용시 별칭 불가

 

2. SEQUENCE

- 일련된 값 (자동증가, 감소)

- 모든 객체에 독립적

-테이블 생성시 PK 설정에 사용

*사용형식

CREATE SEQUENCE 시퀀스명
[START WITH n] -- 시작값 default는 1
[INCREMENT BY n] -- 증가[감소] 값, default는 1
[MAXVALUE n | NOMAXVALUE] -- 최대값 default는 NOMAXVALUE: 10^27
[MINVALUE n | NOMINVALUE] -- 최소값 default는 NOMAXVALUE: 1
[CYCLE | NOCYCLE]--증가는 최대값까지 도달 후 최소값부터 다시 시작여부,
                    --default는 NOCYCLE
[CACHE | NOCACHE]--메모리에 시퀀스 값을 생성하는 지 여부,default는 NOCACHE 20
[ORDER | NOORDER];--요청 순서대로 시퀀스 생성 보장여부, default는 NOORDER

 

시퀀스의 의사컬럼
- CURRVAL : 시퀀스 객체가 가지고 잇는 현재값, 시퀀스명.CURRVAL
- NEXTVAL : 시퀀스 객체의 다음값, 시퀀스명.NEXTVAL
**시퀀드 객체 생성 후 첫번째 명령은 반드시 시퀀스명.NEXTVAL이어야 함 

EX

CREATE SEQUENCE seq_lprod 
START WITH 11;

 

SELECT seq_lprod.CURRVAL FROM DUAL;

오류 sequence SEQ_LPROD.CURRVAL is not yet defined in this session

SELECT seq_lprod.NEXTVAL FROM DUAL;

숙제!

LPROD_ID는 키값이 아니다. 시퀀스값임

11번에 농OR수산물을 p502을 추가해라 (seq_lprod)를 써서

 

'학원수업_Oracle' 카테고리의 다른 글

201104  (0) 2020.11.04
201103  (0) 2020.11.03
201103  (0) 2020.11.03
201102  (0) 2020.11.02
201102  (0) 2020.11.02