DB (ORACLE OBJECT VIEW)

감자·2025년 3월 14일

VIEW

SELECT 쿼리의 실행 결과를 화면에 저장한 논리적 가상 테이블
실제 테이블과는 다르게 실질적 데이터를 저장하고 있진 않지만
사용자는 테이블을 사용하는 것과 동일하게 사용 가능

DML명령어로 VIEW 조작이 불가능한 경우

  1. 뷰 정의에 포함되지 않은 컬럼을 조작하는 경우
  2. 뷰에 포함되지 않은 컬럼 중에 베이스가 되는 컬럼이 NOT NULL 제약조건이 지정된 경우
  3. 산술 표현식으로 정의된 경우
  4. 그룹함수나 GROUP BY절을 포함한 경우
  5. DISTINCT를 포함한 경우
  6. JOIN을 이용해 여러 테이블을 연결한 경우
  1. 뷰 정의에 포함되지 않은 컬럼을 조작하는 경우
    CREATE OR REPLACE VIEW V_JOB2
    AS SELECT JOB_CODE
    FROM JOB;
    INSERT INTO V_JOB2 VALUES(‘J8’, ‘인턴’);
  • 뷰 정의에 포함되지 않은 컬럼을 INSERT/UPDATE/DELETE하는 경우 에러 발생
  1. 뷰에 포함되지 않은 컬럼 중에 베이스가 되는 테이블 컬럼이 NOT NULL제약조건이 지정된 경우
    CREATE OR REPLACE VIEW V_JOB3
    AS SELECT JOB_NAME
    FROM JOB;

INSERT INTO V_JOB3 VALUES(‘인턴’);

  • 뷰에 포함되지 않은 NOT NULL제약조건이 있는 컬럼이 존재하면
    INSERT시 에러 발생
  • UPDATE/DELETE는 가능
  1. 산술 표현식으로 정의된 경우
    CREATE OR REPLACE VIEW EMP_SAL
    AS SELECT EMP_ID, EMP_NAME, SALARY,
    (SALARY + (SALARYNVL(BONUS, 0)))12 연봉
    FROM EMPLOYEE;

INSERT INTO EMP_SAL VALUES(800, ‘정진훈’, 3000000, 36000000);

  • 뷰에 산술 계산식이 포함된 경우 INSERT/UPDATE 시 에러 발생
  • 단 DELETE는 가능
  1. 그룹함수 또는 GROUP BY절을 포함한 경우
    CREATE OR REPLACE VIEW V_GROUPDEPT
    AS SELECT DEPT_CODE, SUM(SALARY) 합계, AVG(SALARY) 평균
    FROM EMPLOYEE
    GROUP BY DEPT_CODE;

INSERT INTO V_GROUPDEPT VALUES(‘D10’, 6000000, 4000000);
DELETE FROM V_GROUPDEPT WHERE DEPT_CODE = ‘D1’;

  • 그룹함수 또는 GROUP BY를 사용한 경우 INSERT/UPDATE/DELETE 시 에러 발생
  1. DISTINCT를 포함한 경우
    CREATE OR REPLACE VIEW V_DT_EMP
    AS SELECT DISTINCT JOB_CODE
    FROM EMPLOYEE;

INSERT INTO V_DT_EMP VALUES(‘J9’);
DELETE FROM V_DT_EMP WHERE JOB_CODE = ‘J1’;

  • DISTINCT를 사용한 경우 INSERT/UPDATE/DELETE 시 에러 발생
  1. JOIN을 이용해 여러 테이블을 연결한 경우
    CREATE OR REPLACE VIEW V_JOINEMP
    AS SELECT EMP_ID, EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE
    JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

INSERT INTO V_JOINEMP VALUES(888, ‘조세오’, ‘인사관리부’);

  • 뷰 정의 시 JOIN을 사용한 경우 INSERT/UPDATE 시 에러 발생
  • 단 DELETE는 가능

VIEW 구조

뷰 정의 시 사용한 쿼리 문장이 TEXT컬럼에 저장되어 있으며
뷰가 실행될 때는 TEXT에 기록된 SELECT에 문장이 다시 실행되면서 결과를 보여주는 구조임

SELECT * FROM USER_VIEWS;

VIEW 옵션

  1. OR REPLACE 옵션
    생성한 뷰가 존재하면 뷰를 갱신함
  2. FORCE/NOFORCE 옵션
    FORCE옵션은 기본 테이블이 존재하지 않더라도 뷰 생성
    NOFORCE 옵션이 기본 값으로 지정되어 있음
  3. WITH CHECK OPTION 옵션
    옵션을 설정한 컬럼의 값을 수정 불가능하게 함(삭제는 가능)
  4. WITH READ ONLY 옵션
    뷰에 대해 조회만 가능하고 삽입, 수정, 삭제 등은 불가능하게 함

INLINE VIEW

일반적으로 FROM절에 사용된 서브쿼리의 결과 화면에 별칭을 붙인 것을 말함
FROM절에 서브쿼리를 직접 사용해도 되고 따로 뷰를 생성 후 FROM절에 생성한 뷰를 사용해도 됨

0개의 댓글