본문 바로가기

카테고리 없음

ORACLE 10g VIEW v1.0

ORACLE 10g VIEW

 

 

1.  VIEW

A.   저장된 쿼리라 할수 있다.

B.   복잡한 쿼리를 단순화 할 수 있으며 VIEW 를 생성하는데 사용된 테이블의 구조 정보를 숨길 수 있어 보안성 측면에서 유리하다.

C.   생성하는데 create view 혹은 create any view 권한이 필요하다.

D.   생성예제

              i.      VIEW 의 생성

SCOTT EMP DEPT 를 조인한 (관계) VIEW를 만들어보고 조회 해 보겠다.

SQL> conn scott/tiger

Connected.

SQL> desc emp

 Name                                      Null?    Type

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

 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)

 

SQL> desc dept

 Name                                      Null?    Type

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

 DEPTNO                                             NUMBER(2)

 DNAME                                              VARCHAR2(14)

 LOC                                                VARCHAR2(13)

 

SQL> create view emp_view  

  2  as

  3  select e.empno,e.ename,d.dname

  4  from emp e, dept d

  5  where e.deptno = d.deptno;

 

View created.

(AS 뒤에 SUB QUERY 를 정의한다.)

SQL> desc emp_view

 Name                                      Null?    Type

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

 EMPNO                                     NOT NULL NUMBER(4)

 ENAME                                              VARCHAR2(10)

 DNAME                                              VARCHAR2(14)

 

SQL> select empno,ename,dname from emp_view;

 

     EMPNO ENAME      DNAME

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

      7934 MILLER     ACCOUNTING

~~ 중략 ~~

7499 ALLEN      SALES

 

14 rows selected.

 

            ii.      VIEW 의 수정

SQL> create or replace view emp_view

  2  as

  3  select e.empno no,e.ename name, d.dname dept_name

  4  from emp e, dept d

5  where e.deptno = d.deptno;

 

View created.

( PL/SQL 과 같이 CREATE OR REPLACE 절을 사용해 수정한다. 이러한 방법을 사용했을 때의 장점은 기존에 이 객체에 묶여있던 권한들이 초기화 되지 않는다는 점이다.)

 

SQL> desc emp_view;

 Name                                      Null?    Type

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

 NO                                        NOT NULL NUMBER(4)

 NAME                                               VARCHAR2(10)

 DEPT_NAME                                          VARCHAR2(14)

 

SQL> select no,name,dept_name from emp_view;

 

        NO NAME       DEPT_NAME

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

      7934 MILLER     ACCOUNTING

~~  중략 ~~

      7499 ALLEN      SALES

 

14 rows selected.

 

2.  VIEW 의 정의 조회

A.   USER_VIEW 를 이용한 방법

SQL> select text from user_views

  2  where view_name =

  3  'EMP_VIEW';

 

TEXT

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

select e.empno no,e.ename name, d.dname dept_name

from emp e, dept d

where e.dep

B.   DBMS_METADATA.GET_DDL 을 이용한 방법

SQL> set long 100000

 

SQL> select dbms_metadata.get_ddl('VIEW', view_name)

2  from user_views

3  where view_name = 'EMP_VIEW';

 

DBMS_METADATA.GET_DDL('VIEW',VIEW_NAME)

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

 

  CREATE OR REPLACE FORCE VIEW "SCOTT"."EMP_VIEW" ("NO", "NAME", "DEPT_NAME") AS

 

select e.empno no,e.ename name, d.dname dept_name

from emp e, dept d

where e.deptno = d.deptno

 

3.  MATERIALIZED VIEW

A.   쿼리의 결과를 가지고 있는 VIEW 이다.

B.   일반적인 VIEW와 달리 값을 가지고 있기 때문에 MATERIALIZED VIEW ( 실체화된  VIEW 라 불리운다. )

C.   생성하는데 create materialized view 혹은 create any materialized view 권한이 필요하며 추가적으로 MVIEW 에 사용할 테이블 ( MASTER TABLE )에 대해 SELECT TABLE 이나 SELECT ANY TABLE 객체 권한이 필요하다.

D.   생성예제

SQL> grant create materialized view to scott;

 

Grant succeeded.

 

(CREATE MATERIALIZED VIEW 권한을 부여하였다.)

 

SQL> create table samp as

  2  select empno,ename from emp;

 

Table created.

( 예제로 사용할 테이블 SAMP 를 생성하였다. )

SQL> commit;

 

Commit complete.

 

SQL> desc samp;

 Name                                      Null?    Type

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

 EMPNO                                     NOT NULL NUMBER(4)

 ENAME                                              VARCHAR2(10)

 

SQL> alter table samp     

  2  add constraint samp_empno_pk primary key(empno);

 

Table altered.

 

 

SQL> create materialized view log on samp     

  2  with rowid, primary key

  3  including new values;

 

Materialized view log created.

 

(MVIEW 를 생성하려면 우선 MATERIALIZED VIEW LOG 가 필요하다. )

 

SQL> create materialized view m_samp

  2  refresh fast on commit

  3  with primary key

  4  as select count(empno) from samp;

 

Materialized view created.

 

SQL> desc m_samp

 Name                                      Null?    Type

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

 COUNT(EMPNO)                                       NUMBER

(MVIEW 의 구성정보를 조회하면 SUB QUERY 에 사용했던 집단함수가 그대로 조회되는 걸 확인 할 수 있다.)

 

SQL> select * from m_samp;

 

COUNT(EMPNO)

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

          14

 

(조회 해 보면 SUB QUERY 의 결과 : COUNT(EMPNO) 를 저장하고 있음을 알 수 있다.)

SQL> insert into samp

  2  select empno + 1000, ename from samp;

 

14 rows created.

 

SQL> select * from m_samp;

 

COUNT(EMPNO)

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

          14

 

(INSERT 가 수행했음에도 불구하고 MVIEW 의 내용은 그대로이다.)

SQL> commit;

 

Commit complete.

 

SQL> select * from m_samp;

 

COUNT(EMPNO)

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

          28

 

(COMMIT 을 수행한 후 조회한 결과 결과값이 증가한 걸 알 수 있다. 이는 REFRESH FAST ON COMMIT 이란 구문에 근거하고 있으며 여러가지 조건을 사용할 수 있는 부분이다.)

 

/*+ MVIEW 의 종류는 OCP 과정에서 배우는 내용에 비할 수 없을 정도로 다양하고 복잡했다. 추가적인 내용은 추후에 MVIEW 라는 내용으로 다루고자 한다. */