2020041302 / 뷰(View)

-- * 오라클 뷰(View)


-- [1] 뷰의 데스트용 테이블 생성

-- (1) DEPT 테이블을 복사한 DEPT_COPY 테이블을 생성

create table dept_copy

as

select * from dep; -- dept 모든 테이터를 dept_copy 테이블에 복사


-- (2) EMP 테이블을 복한 EMP_COPY 테이블을 생성

create table emp_copy

as

select * from emp;


-- [2] 뷰(View) 정의하기

-- 뷰를 생성하기 위해서는 create view로 시작한다

-- as 다음은 마치 서브쿼리문과 유사하다

-- 서브쿼리는 우리가 지금까지 사용하였던 select 문을 기술하면 된다


-- ex) 만일 30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 자주 검색한다고 하면

select empno, ename, deptno

from emp_copy

where deptno = 30;


-- 위와 같이 결과를 출력하기 위해서 매번 select문을 입력하기란 여간 번거로운 일이 아닐 수 없음

-- 뷰는 이와같이 번거로운 select문을 매번 입력하는 대신 보다 쉽게 원하는 결과를 얻고자

-- 출발한 개념


create view emp_view30 -- 가상 emp_view30을 만든것이다.

as 

select empno, ename, deptno

from emp_copy

where deptno = 30;


-- 위 실행 시 error

create view emp_view30

as 

select empno, ename, deptno

from emp_copy

where deptno = 30;

오류 보고 -

ORA-01031: insufficient privileges -- 권한이 불충분합니다

01031. 00000 -  "insufficient privileges"

*Cause:    An attempt was made to perform a database operation without

           the necessary privileges.

*Action:   Ask your database administrator or designated security

           administrator to grant you the necessary privileges


-- 위 해결방법

-- dos command 차에서 sqlplus로 연결

-- dos cmd

C:\Users\tjoeun>sqlplus system/admin1234


SQL*Plus: Release 11.2.0.2.0 Production on 월 4월 13 11:20:53 2020

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production


SQL> show user --시스템인지 확인

USER is "SYSTEM"

SQL>


-- grant 명령어 권한부여 명령어

SQL> grant create view to scott;

Grant succeeded. --권한부여 완료

SQL>


-- 재 실행 시 정상동작

create view emp_view30

as 

select empno, ename, deptno

from emp_copy

where deptno = 30;


View EMP_VIEW30이(가) 생성되었습니다. --실행결과


select * from emp_view30;

--desc 각 컬럼에 대한 이름과 자료형 형태를 보여주는 명령어


desc emp_view30;

이름     널? 유형           

------ -- ------------ 

EMPNO     NUMBER(4)    

ENAME     VARCHAR2(10) 

DEPTNO    NUMBER(2)



desc emp;

이름       널?       유형           

-------- -------- ------------ 

EMPNO    NOT NULL NUMBER(4)    

ENAME             VARCHAR2(10) 

JOB               VARCHAR2(9)  

MGR               NUMBER(4)    

HIREDATE          DATE         

SAL               NUMBER(7,2)  

COMM              NUMBER(7,2)  

DEPTNO            NUMBER(2)


-- 위에서 보여지듯 view로 생성 시 프라이머리와 같은 데이터 무결성 제약 조건(DICR)까지 복사되어 지지는 않는다


-- [문제] 기본 테이블은 emp_copy로 합니다. 20번 부서에 소속된 사원들이ㅡ

-- 사번과 이름, 부서번호, 상관의 사번을 출력하기 위한 select 문을

-- emp_view20 이라는 이름의 뷰로 정의해 보자



-- [3] 뷰의 내부 구조와 user_views 데이터 딕셔너리

desc user_views;


이름               널?       유형             

---------------- -------- -------------- 

VIEW_NAME        NOT NULL VARCHAR2(30)   

TEXT_LENGTH               NUMBER         

TEXT                      LONG           

TYPE_TEXT_LENGTH          NUMBER         

TYPE_TEXT                 VARCHAR2(4000) 

OID_TEXT_LENGTH           NUMBER         

OID_TEXT                  VARCHAR2(4000) 

VIEW_TYPE_OWNER           VARCHAR2(30)   

VIEW_TYPE                 VARCHAR2(30)   

SUPERVIEW_NAME            VARCHAR2(30)   

EDITIONING_VIEW           VARCHAR2(1)    

READ_ONLY                 VARCHAR2(1)


select view_name, text from user_views;

VIEW_NAME        TEXT

EMP_VIEW30 "select empno, ename, deptno from emp_copy where deptno = 30"



-- [4] 뷰의 동작 원리

-- 1) 사용자가 뷰에 대해서 질의를 하면 USER_VIEWS에서

-- 뷰에 대한 정의를 조회한다

-- 2) 기본 테이블에 대한 접근 권한을 살핀다

-- 3) 뷰에 대한 질의를 기본테이블에 대한 질의로 변환

-- 4) 기본 테이블에 대한 질의를 통해 데이터를 검색

-- 5) 검색된 결과를 출력한다



-- [5] 뷰와 기본 테이블 관계 파악

-- 1) 뷰를 통한 데이터 저장이 가능한가?

insert into emp_view30

values (8000, 'ANGEL', 30);

1 행 이(가) 삽입되었습니다.


select * from emp_view30; -- 데이터가 삽이 가능하다



select * from emp_copy; -- 



-- [6] 뷰를 사용하는 이유? --pdf 참조


-- ex) 인사과 뷰


-- view 생성방법

create view emp_vies

as

select empno, ename, job, hiredate, deptno

from emp_copy;



-- [7] 뷰의 특징

-- 1) 단순 뷰에 대한 데이터 조작

insert into emp_view30

values(8010, 'SHEOLSOO' , 30 );


select * from emp_view30;


select * from emp_copy;



-- 2) 단순 뷰의 컬럼에 별칭 부여하기

create view emp_view_copy(사원번호, 사원명, 급여, 부서번호) -- 따옴표를 생략하고 

as

select empno, ename, sal, deptno

from emp_copy;


select * from emp_view_copy; -- 위에서 입력한 테이블명이 별칭으로 출력되는 것을 확인 가능하다

--where deptno = 30; --error

whrer 부서번호 = 30


select * from emp_view_copy; -- 위에서 입력한 테이블명이 별칭으로 출력되는 것을 확인 가능하다

--where deptno = 30; --error, 별칭을 사용한 이름으로 출력이 가능함



select * from emp_view_copy; -- 위에서 입력한 테이블명이 별칭으로 출력되는 것을 확인 가능하다

whrer 부서번호 = 30



-- 3) 그룹 함수를 사용한 단순뷰


create view view_sal

as

select deptno, sum(sal), avg(sal) -- 원본 데이터 컬럼이름이 없어서 view를 생성하지 못한다

from emp_copy

group by deptno; -- error


error 문구


create view view_sal

as

select deptno, sum(sal) as "급여합", avg(sal) as "급여평균" -- 원본 데이터 컬럼이름이 없어서 view를 생성하지 못한다

from emp_copy

group by deptno;


select * from view_sal;





-- 주의

create view view_sal_year

as

select ename, sal * 12 "연봉"

from emp_copy;


select * from view_sal_year;





-- 4) 복합 뷰

select empno, ename, sal, e.deptno, dname, loc

from emp e, dept d

where e.deptno = d.deptno

order by empno desc; -- 사원번호를 기준으로 내림차순으로 출력하라



-- 뷰 테이블로 작성

create view emp_view_dept

as

select empno, ename, sal, e.deptno, dname, loc

from emp e, dept d

where e.deptno = d.deptno

order by empno desc;



select * from emp_view_dept;



-- [8] 뷰 삭제

drop view emp_view_dept;



-- 실습에서 만들어진 뷰 확인

select view_name, text from user_views;



-- [9] 뷰 생성에 사용되는 다양한 옵션

-- or replace

-- : 조재하지 않는 뷰이면 새로운 뷰를 생성하고 기존에 존재하는 뷰이면 그 내용을 변경한다

create or replace view emp_view30

as

select empno, ename, comm, deptno

from emp_copy

where deptno = 30;


select * from emp_view30;



-- [10] 뷰 생성에 사용되는 다양한 옵션

-- force

-- : 기본테이블이 존재하지 않을 때도 뷰를 생성해야 하는 경우 사용한다

-- noforce

-- : 기본테이블이 존재하는 경우만 뷰가 생성(default) 


desc employees;


select * from employees;


create or replace view employees_view

as

select empno, ename, deptno

from employees

where deptno = 30;



create or replace force view employees_view

as

select empno, ename, deptno

from employees

where deptno = 30;

컴파일 오류는 발생과 함께 뷰가 생성되었습니다.



select view_name, text

from user_views;


insert into employees_view

values(8020, '이순신', 30); -- error 실제로 존재하는 테이블이 아니기 때문이다




-- [11] 뷰 생성에 사용되는 다양한 옵션

-- whit check option

-- : 뷰를 생성할 때 조건 제시에 사용된 컬럼 값을 변경 못하도록 하는기능

-- : 뷰를 설정할 때 조건으로 설정한 컬럼 이외이 다른 컬럼의 내용은 변경할 수 있다


create or replace view emp_view30

as

select empno, ename, sal, comm, deptno -- sal 만 추가해서 실습진행

from emp_copy

where deptno = 30;


selec





























'ORACLE' 카테고리의 다른 글

2020041003 / 11_3) non-eqie join (비등가조인)  (0) 2020.04.30
2020041402 / 인덱스(index)  (0) 2020.04.30
2020040902 - Transaction (트랜잭션)  (0) 2020.04.30
0416 - 02 - eXERD 설치  (0) 2020.04.30
0416 - 01 - 데이터베이스 설계  (0) 2020.04.30

댓글

Designed by JB FACTORY