ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • oracle 뷰
    DataBase/oracle 2020. 3. 21. 17:58

     

    View : table 과 유사하며 테이블처럼 사용한다

            테이블과는 달리 데이터를 저장하기위한 물리적은 공간이 필요하지않은 가상테이블(vitual table)이다

            데이터를 물리적으로 갖지 않지만 논리적인 집합을 갖는다!

            테이블과 마찬가지로 select , insert, update, delete 명령이 가능하다

            뷰를 생성할 때 create 명령으로 생성한다

            

    View 의 활용이유

            1) 보안관리를 위한 뷰

                 보안 등급에 맞춰서 컬럼 및 범위를 정하여 조회 하도록 함

                 연산 결과만 제공하고 알고리즘을 숨기기 위해 사용

                 selectList 를 함수로 가공하여 update, insert를 못하도록 함

                 테이블 명이나 컬럼 명을 숨기도록 함

            2) 사용편의성을 위한 뷰

                 검색 조건을 단순화하여 사용할 수 있도록 함

                 조인을 단순화

                 사용자를 위한 컬럼명이나 테이블명 제공

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    /* View */
     
    create view v_emp( emp_id, first_name, job_id, hiredate, dept_id )as 
    select employee_id, first_name, job_id, hire_date,department_id -- 논리적인 집합 시작
    from employees
    where job_id = 'ST_CLERK';
     
    --v_emp 의 데이터는 어느 물리적 공간에 존재하는게 아니라 논리적인 집합 형태로 존재한다...?!
     
    create view v_emp1( emp_id, first_name, job_id, hiredate, dept_id )as 
    select employee_id, first_name, job_id, hire_date,department_id 
    from employees
    where job_id = 'SH_CLERK';
     
    -- 1) view 조회
    select * from v_emp;
     
    --2) view 제거
    drop view v_emp1;
     
    --3) view 수정
    create or replace view v_emp( emp_id, first_name, job_id, hiredate, dept_id )as 
    select employee_id, first_name, job_id, hire_date,department_id 
    from employees
    where job_id = 'SH_CLERK';
     
    --4) 함수를 사용하여 값수정을 못하게
    -- nvl(employee_id, null) :: 함수를 써서 수정할 수 없게 하겠다!!!
    create or replace view v_emp3( emp_id, first_name, job_id, hiredate, dept_id )as 
    select nvl(employee_id, null), nvl(first_name,null), job_id, hire_date,department_id 
    from employees
    where job_id = 'SH_CLERK';
     
    desc v_emp3;
     
    update v_emp3  set first_name = 'kim' where first_name = 'Julia'--에러
    -- SQL 오류: ORA-01733: virtual column not allowed here
    -- 01733. 00000 -  "virtual column not allowed here"
     
    update v_emp set first_name = 'kim' where first_name = 'Julia'-- 실행, 수정됨
     
     
    --5) 연산과정을 숨기고 결과값만 보이기
    create view v_emp_salary (emp_id, last_namem, annual_sal) as
    select employee_id, last_name, (salary + nvl (commission_pct, 0))*12
    from employees;
     
    select * from v_emp_salary;
     
    --6) read only
    create view v_emp_readonly (emp_id, last_namem, annual_sal) as
    select employee_id, last_name, (salary + nvl (commission_pct, 0))*12
    from employees
    with read only;
     
    desc v_emp_readonly;
    select * from v_emp_readonly;
     
    update v_emp_readonly set last_namem = 'KIM' where last_namem = 'Gietz';
    --SQL 오류: ORA-42399: cannot perform a DML operation on a read-only view
    --42399.0000 - "cannot perform a DML operation on a read-only view"
     
    --7) 사용자 편의성
    create view v_sample1 as
    select employee_id, last_name, department_id ,hire_date
    from employees
    where (salary + nvl( commission_pct, 0) ) *12 > 40000
    and department_id = 50
    and job_id = 'ST_CLERK'
    and sysdate - 365 * 5 > hire_date;
     
    select * from v_sample1;
     
    create view 사원 ( 사번, 이름, 부서번호, 입사일 )as
    select employee_id, first_name||' '||last_name, department_id, hire_date
    from employees
    where department_id = 50;
     
    SELECT * from 사원;
     
     
    create  view v_join(사번,이름, 부서번호, 부서명, 입사일) as
    select emp.employee_id, emp.first_name||' '||emp.last_name, emp.department_id,
           dept.department_name, emp.hire_date
    from employees emp, departments dept
    where emp.department_id = dept.department_id;
     
    select * from v_join;
     
    http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

     

    'DataBase > oracle' 카테고리의 다른 글

    oracle 계층형 쿼리  (0) 2020.03.22
    oracle 시퀀스  (0) 2020.03.22
    oracle 제약조건  (0) 2020.03.21
    oracle DML  (0) 2020.03.21
    oracle create, drop, alter, truncate  (0) 2020.03.19

    댓글

Designed by Tistory.