ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle(2022.02.28)-View
    카테고리 없음 2022. 2. 28. 15:57
    728x90

    view 객체
     -view는 테이블과 유사한 오라클 객체
     -select 문의 결과가 가장 전형적인 뷰임
     -필요한 정보가 여러 테이블에 분산되어 있는 경우
     -특정자료에 대한 접근을 제한하고 결과는 제공할때 


      (사용형식)

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

     . 'OR REPLACE':같은 이름의 뷰 만들어지고, 이미 있을경우는 덮어 씌운다.
     . '(컬럼list)' : 생성된 뷰에서 사용할 컬럼명
         -(컬럼list)를 생략하면 뷰의 SELECT절에 사용된 컬럼의 별칭 
          또는 뷰의 SELECT절에 컬럼의 별칭이 사용되지 않았으면 SELECT절에 컬럼명이
          뷰의 컬럼명이 됨
     . 원본테이블은 언제든지 바뀔 수 있으며 SELECT 문의 데이터가 바뀌면 VIEW 값도 바뀐다. 
          VIEW 를 바꾸면 원본테이블도 바뀐다. 원본테이블이 바뀌지 않으려면 'WITH READ ONLY'사용 
     .'WITH READ ONLY': 읽기전용 뷰 생성 ,VIEW가 INSERT,UPDATE,DELETE (DML명령) 못하게 하며 원본테이블과는 상관    이 없다.
     .'WITH CHECK OPTION' : 'SELECT 문'의 WHERE 조건을 위배하는 DML명령을 
          뷰를 대상으로 수행시킬수 없음. DML실행될 수 있는 조건하에 실행됨
     .'WITH READ ONLY'와 'WITH CHECK OPTION'는 같이 사용할 수 없음.

     

    사용예) 회원테이블에서 마일리지가 3000이상인 회원의 회원번호, 회원명, 직업, 마일리지를 조회하고 이를 뷰로 생성하시오

      CREATE OR REPLACE VIEW V_MEM01(MID,MNAME,MJOB,MILE)
      AS
        SELECT MEM_ID AS 회원번호,
               MEM_NAME AS 회원명,
               MEM_JOB AS 직업,
               MEM_MILEAGE AS 마일리지
            FROM MEMBER
           WHERE MEM_MILEAGE>=3000;

    (뷰 확인)   

     SELECT *FROM V_MEM01;

    <view이름에 컬럼리스트가 없을 경우>

    CREATE OR REPLACE VIEW V_MEM01
      AS
        SELECT MEM_ID AS 회원번호,
               MEM_NAME AS 회원명,
               MEM_JOB AS 직업,
               MEM_MILEAGE AS 마일리지
            FROM MEMBER
           WHERE MEM_MILEAGE>=3000;

    (뷰 확인)

     SELECT *FROM V_MEM01;

     CREATE OR REPLACE VIEW V_MEM01
      AS
        SELECT MEM_ID ,
               MEM_NAME ,
               MEM_JOB ,
               MEM_MILEAGE 
            FROM MEMBER
           WHERE MEM_MILEAGE>=3000;

    (뷰 확인)

    SELECT *FROM V_MEM01;


    테이블 생성 (원본데이터를 지우거나 조작할 수 없으므로 연습사마 확인할때 복사본데이터로 테스트)

     CREATE TABLE TEMP_MEM
      AS
        SELECT MEM_ID,MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_JOB,MEM_MILEAGE
          FROM MEMBER;

    사용예) TEMP_MEM 테이블을 이용하여 마일리지가 3000이상이며 여성회원으로 구성된
           뷰(V_TMEM01)을 생성하시오. 컬럼은 회원번호, 회원명, 직업, 마일리지
          

     CREATE OR REPLACE VIEW V_TMEM01
      AS 
        SELECT MEM_ID AS 회원번호,
               MEM_NAME AS 회원명,
               MEM_JOB AS 직업,
               MEM_MILEAGE AS 마일리지
         FROM TEMP_MEM
        WHERE MEM_MILEAGE>=3000
          AND SUBSTR(MEM_REGNO2,1,1) IN ('2','4');

     1)뷰(V_TEME01)의 내용 UPDATE->'S001'회원의 마일리지를 2500으로 변경하세요
        ->뷰 테이블 변경하면 원본테이블 변경된다.

    UPDATE V_TMEM01 
           SET 마일리지=2500
         WHERE 회원번호='s001';

     2)원본테이블(TEMP_MEM)의 내용 UPDATE->'s001'회원의 마일리지를 2500에서 7500으로 변경
        ->원본을 고쳤더니 뷰도 고쳐진다.

     UPDATE TEMP_MEM
           SET MEM_MILEAGE=7500
        WHERE MEM_ID='s001'
    SELECT *FROM TEMP_MEM;

    SELECT *FROM TEMP_MEM;


    사용예)TEMP_MEM 테이블을 이용하여 마일리지가 3000이상이며 여성회원으로 구성된 뷰(V_TMEM02)를 읽기전용으로 생성하시오
           뷰(V_TMEM01)을 생성하시오. 컬럼은 회원번호, 회원명, 직업, 마일리지

      CREATE OR REPLACE VIEW V_TMEM02
      AS 
        SELECT MEM_ID AS 회원번호,
               MEM_NAME AS 회원명,
               MEM_JOB AS 직업,
               MEM_MILEAGE AS 마일리지
         FROM TEMP_MEM
        WHERE MEM_MILEAGE>=3000
          AND SUBSTR(MEM_REGNO2,1,1) IN ('2','4')
        WITH READ ONLY;

    1)뷰(V_TEME02)의 내용 UPDATE->'s001'회원의 마일리지를 2500으로 변경하세요
        ->뷰의 값을 변경할 수 없음

     UPDATE V_TMEM02 
           SET 마일리지=2500
         WHERE 회원번호='s001';

     2)원본테이블(TEMP_MEM)의 내용 UPDATE->'s001'회원의 마일리지를 2500에서 7500으로 변경
        ->뷰를 대상X 원본테이블 대상이며 원본테이블은 얼마든지 변경 가능하다.

    UPDATE TEMP_MEM
           SET MEM_MILEAGE=2500
          WHERE MEM_ID='s001';

    TEMP_MEM 데이터 변경(원본테이블)

     SELECT *FROM TEMP_MEM;

    뷰 테이블도 변경되었다.

     SELECT *FROM V_TMEM02;

     


    사용예) TEMP_MEM테이블을 이용하여 마일리지가 3000이상인 회원들로 WITH CHECK OPTION을 갖는 
           뷰(V_TEME03)을 생성하시오 컬럼은 회원번호, 회원명, 직업 ,마일리지이다.

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

     1)뷰(V_TMEM03)에서 'e001'회원(이혜나)의 마일리지를 6500에서 1000으로 수정

      UPDATE V_TMEM03
             SET 마일리지=1000
            WHERE 회원번호='e001';

     WITH CHECK OPTION을 썼기 때문에 조건을 맞춰야 하고 , 3000이상으로 하면 바뀐다.

    UPDATE V_TMEM03
             SET 마일리지=16500
            WHERE 회원번호='e001';

    V_TMEM03뷰가 바뀜

    TEMP_MEM테이블도 같이 바뀜

     2)원본테이블(TEMP_MEM)의 내용 UPDATE-> 'e001'회원의 마일리지를 2500으로 변경
        ->원본테이블이 변경되는것은 뷰와는 전혀 상관이없다. 그래서 원본테이블은 언제든지 어떤값으로도 변경 가능하다.

    UPDATE TEMP_MEM
               SET MEM_MILEAGE=2500
             WHERE MEM_ID='e001';

     

    728x90
Designed by Tistory.