Or14View
View는 테이블로부터 생성된 가상의 테이블로 물리적으로는 존재하지 않는 테이블
View는 하나 또는 그 이상의테이블로부터 생성된 가상의 테이블이다.
물리적으로나 존재하지 않는 테이블이다.
DB의 선택적인 내용을 보여줄 수 있기 때문에 DB에 대한 엑세스 제한이 가능하다.
복잡한 쿼리문을 통해 얻을 ㅜㅅ 있는 결과를 간단한 쿼리문으로 얻을 수 이싿.
하나의 테이블로 만든 View에서는 DML(insert, update, delete)문을 수행할 수 있지만
여러 테이블로 만든 View에서는 DML문을 수행할 수 없다.
View생성시 order by를 포함할 수 없다.(Oracle 81 이전버전까지)
View의 장점
1) 보안성 : 중요한 컬럼을 숨길수 있어 보안을 유지할 수 있다.
2) 편의성 : 여러개의 테이블 사용을 위한 복잡한 조인문을 사용하더라도 사용자는 이를 몰라도된다.
3) 간결성 : View를 사용하면 Application을 개발할 때 복잡한 쿼리문을 숨길 수 있어 소스가 간결해지낟.
View의 생성
사용법 :
create [or replace] view 뷰이름 [(컬럼1, 컬럼2.....)]
as
select * from 테이블명 조건들; (테이블이 2개 이상이라면 join도 가능)
# 컬럼명은 원본테이블과 다르게 지정할 수 있다.
# 만약 동일한 이름의 뷰가 존재하면 오류가 발생한다.
- 생성된 뷰 정보보기
사용법 :
select * from user_views; 데이=터사전
- 뷰 생성하기
예시] hr계정의 사원테이블에서 직무아이디가 ST_CLERK인 사원의 사원번호, 이름, 직무아이디, 입사명, 부서번호를 조회할 수 있는 뷰를 아래의 조건에 맞게 생성하시오.
뷰 명칭 v_employees1
컬럼명 emp_id, J_id, h_date, dept_id
- 1. 위에서 제시한 조건으로 select문 만들기
create view v_employees1 (emp_id, f_name, j_id, j_date, dept_id)
as
-2. 조건에 만족한다면 위 쿼리를 이용하여 view 생성하기
select employees_id, first_name, job_id, hire_date, department_id
from employees
where job_id = ST_CLERK;
-3. 뷰를 통해 레코드 확인하기
select * from v_employees1;
-4. 생성된 뷰의 정보보기(데이터사전)
select * from user_views whee view_name = upper('v_employees1');
View의 수정
사용법
create or replace view
as
select * from 테이블명 조건1, 조건2.....(join문 가능)
# 해당 뷰가 이미 존재한다면 위 조건으로 수정된다.( 즉, 덮어쓰기 된다.)
# 생성된 뷰가 없다면 새롭게 생성된다. 즉, 처음 생성할 때 replace명령을
사용해도 무방하다. (단, 기존에 만들어진 View가 사라질 수 있으므로 주의를 요한다.)
예시] 위에서 생성된 v_employees1 뷰를 아래 조건에 맞게 수정하시오.
사원테이블의 직무아이디가 ST_MAN인 사원의 사원번호, 이름, 이메일, 매니저아이디를 조회하도록 하시오.
단, 뷰의 칼럼은 e_id, name, email, m_id로 지정하시오.
create or replace view v_employees1 (e_id, name, email, m_id)
as
select employee_id, first_name, email, manager_id
from employees
where job_id ='ST_MAN'; -- create로 생성하면 기존의 뷰가 있으므로 오류 발생
select * from v_employees1;
View 삭제하기
사용법 :
drop view 뷰 이름;
drop view v_employee1;
select * from v_employees1;
-읽기전용 View만들기
사용법 :
create view 뷰이름(컬럼1, 컬럼2...............)
as
select * from 테이블명 조건1, 조건2...............)
with rad only;
# 읽기전용 뷰에서는 DML문(insert, update, delete)을 사용할 수 없다.
단, select문은 가능하다.
예시] 사원번호, 이름, 연봉을 계산하며 출력하는 뷰를 생성하시오.
단, 읽기전용으로 생성해야 하며, 뷰의 컬럼은 emp_id, l_name, annual_sal로 지정하시오.
[연봉=(급여+보너스율)*12
뷰이름 v_employ_readonly
create view v_employ_radonly(ep_id, l_name, annual_sal)
as
select employee_id, last_name, (salary+nvl(commission_pct, 0)) * 12
from employees
with read only;
drop view v_employ_readonly;
-기존테이블 확인
select employee_id, last_name, salary from employees;
- 뷰 확인
select * from v_employ_readonly;
-dml문(update)이 적용되는 지 확인
update v_employ_readonly set l_name='홍길동' where emp_id=100;
-SQL오류 : ORA42399 읽기 전용 뷰에서는 DML작업을 수행할 수 없습니다.
-with check option
:해당 뷰를 볼 수 있는 범위내에서만 update, insert가 가능하도록 하는 옵션.
즉, 뷰의 조건을 where id ='100'이라고 설정했다면 id가 100인 데이터만 insert, update될 수있도록 하는 옵션
예시] 직무아이디가 ST_MAN인 사원을 조회할 수 있는 뷰를 새엇ㅇ하시오.
사원번호, 이름, 이메일, 입사일, 직무아이디 View에서는
e_idx, f_name, l_name, email, h_date, j_id로 표현하시오.
create view v_emp_no_withcheck
(e_idx, f_name, l_name, email, h_date, j_id)
as select
employee_id, first_name, last_name, email, hire_date, job_id
from
employees
where job_id ='ST_MAN';
- 뷰를 통해서 레코드 확인
select * from v_emp_no_withcheck;
-위에서 생성한 뷰를 통해 insert를 시도
insert into v_emp_no_withcheck;
-위에서 생성한 뷰를 통해 insert를 시도
(300, '홍', '길동', 'insert@kosmo.co.kr',sysdate,'MK_MAN');
레코드가 정상적으로 입력이 되었으나 이는 적절치 않다.
v_emp_no_withcheck 뷰는 업무아이디가 ST_MAN인 사원만 조회할 목적으로
생성되었으므로 해당 뷰를 통해 다른 업무를 가진 사원을 입력하는 것은
사용목적에 위배되는 사항이다. 이런 업무적 오류를 막기위해 with check option을 사용한다.
- employees 테이블에서 직접 확인
select * from employees where employee_id =300;
--with check option 옵션을 사용하여 뷰 수정
create or replace view v_emp_no_withcheck
(e_idx, f_name, l_name, email, h_date, j_id)
as select
employee_id, fist_name, last_name, email, hire_date, job_id
from
employees
where job_id = 'ST_MAN'
WITH CHECK OPTION
--위에서 수정한 뷰를 통해 insert를 시도
insert into v_emp_no_withcheck values
(301, '홍', '길동', 'insert@kosmo.co.kr',sysdate, 'MK_MAN');
ORA 01402 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다.
즉, 해당 뷰의 조건과 다른 레코드는 입력을 원천적으로 막을 수 있게 되었다.
View 활용하기
뷰생성시 문자열함수 사용하기
예시) 사원테이블에서 부서번호가 50, 80인 사원만 조회하는 뷰를 생성하시오.
출력할 컬럼은 사원번호, 전체이름(성+이름), 전화번호, 보너스율, 입사일, 부서번호이다.
-- 위에서 생성된 뷰에서 날자를 0000-00-00형태로 변경
create or replace view v_employ_fullname
(emp_id, full_name, p_number, c_percent, h_date, dept_id)
as select
employee_id, concat(concat(first_name, ' '), last_name), phone_number,
nvl(commission_pct, 0), to_char(hire_date, 'yyyy-mm-dd'),
department_id
from employees
where department_id in(50,80);
select * from v_employ_fullname;
update v_employ_fullname set full_name = '마이클잭슨'
where emp_id =120;
SQL오류 ORA 01733 가상 열은 사용할 수 없습니다.
full_name은 first_name, last_name을 합쳐서 만든 가상의 컬럼이므로
해당 컬럼에는 업데이트 할 수 없다.
update v_employ_fullname set p_number ='010-1234-5678'
where emp_id=120;
p_number에 해당하는 원본테이블의 컬럼이 존재하므로 뷰와 실제테이블에 업데이트 됨.
select * from v_employ_fullname where emp_id =120;
select * from employees where employee_id = 120;
예시] 연봉을 출력하는 뷰를 새엉하시오.
출력내용 : 사원번호, 전체이름(이름+성), 월급, 연봉
에ㅕㄴ봉계산식 : (급여 *12)+ (급여*12)*보너스율)
View 이름 : v_emp_year_sal
단, 이름을 합칠 때는 concast을 사용하지 말고 || 를 사용한다.
create view v_emp_year_sal
(emp_id, full_name, sal, annual_sal)
as select
employee_id, first_name||' '|| last_name, slaary,
(salary*12) + (salary *12) *nvl(commission_pct, 0)
from employees
where 1=1;
select * from v_emp_year_sal;
- 금액이 출력되는 부분에 세자리마다 컴마를 찍어서 출력되도록 뷰를 수정하시오.
create or replace view v_emp_year_sal
(emp_id, full_name, sal, annual_sal)
as select
employee_id, first_name||' 'last_name, to_char(salary, '$999,000'),
to_char((salary*12) + (salary*12)*nvl(commission_pct, 0), '$999,000')
from employees
where 1=1;
조인을 통한 View새성
예시) 사원테이블과 부서테이블을 조인하며 사원번호, 전체이름, 부서번호, 부서명 입사일자를 출력하는 뷰를 생성하시오.
뷰의 컬럼명은 위 조건과 같이 한글로 지정하시오.
create view v_emp_join(사원번호, 전체이름, 부서번호, 부서명, 입사이랒)
as select
employee_id, first_name ||' '||last_name, D.department_id,
department_name, hire_date
from
employees E inner join departments D
on E.department_id = D.department_id
where 1=1;
select * from v_emp_join;
--뷰를 확인할 수 있는 데이터 사전
select * from user_views;
'프로그래밍 > Oracle' 카테고리의 다른 글
Or05Date (0) | 2017.11.15 |
---|---|
Or04TypeConvert (0) | 2017.11.15 |
Or03String (0) | 2017.11.15 |
Or02Number (0) | 2017.11.15 |
ExSchool01 (0) | 2017.11.15 |