2013년 10월 17일 목요일

오라클 뷰(오라클 뷰, Oracle View)

뷰(View)
- 하나또는 그 이상의 테이블이나 뷰를 기본으로 하는 논리적인 테이블
- 자체 데이터를 보관하지는 않는다
- 뷰의 기본이 되는 테이블은 Base Table이라고 한다.
- 오라클의 경우 뷰의 정의(쿼리의 텍스트)를 데이터 딧셔너리에 저장한다.
- 뷰를 만들기 위해서는 Create View 시스템 권한이 있어야 한다.
[문법]
CREATE [OR REPLACE] [FORCE|NO FORCE] VIEW  view_name   [(alias[,alias]...)]
AS Subquery
[WITH READ ONLY]
[WITH CHECK OPTION [CONSTRAINT constraint]];

[예제]
SQL>  CREATE VIEW emp30  
                 AS SELECT empno, ename, sal
                       FROM emp WHERE deptno = 30;
     SQL>  DESC emp30
     SQL>  SELECT * FROM emp30;
     SQL>  CREATE OR REPLACE VIEW emp30
                  (eno, name, payroll)
                 AS SELECT empno, ename, sal 
                FROM emp  WHERE deptno = 30;

- Simple View
하나의 테이블을 기본으로 뷰 생성
기본적으로 Insert, Update, Delete 가능
뷰가 Join condition , Aggregate Function, GROUP BY clause, DISTINCT을 포함하는 경우 삭제 불가
위 조건 외 __EXPRESSION__으로 정의된 Column을 포함하는 경우 Update 불가
추가로 View로 선택되지 않은 NOT NULL Column을 포함하는 경우에는 Insert 불가
 
- Complex View
여러 테이블로 뷰 규성
기본적으로 Insert, Update, Delete 불 가능
 
- 업데이트 가능한 조인 뷰
여러테이블 또는 뷰로 구성
Insert, Update, Delete 가능
USER_UPDATABLE_COLUMNS 뷰를 통해서 업데이트 가능한 조인 뷰의 컬럼들을 알 수 있다.
 
- 인라인뷰(Inline View)
스키마 오브젝트는 아님
SQL 문장안에서 마치 뷰처럼 사용되는 서브 쿼리

[실습]
SQL> CREATE TABLE viewtest
           AS SELECT id, last_name, dept_id FROM s_emp;
SQL> CREATE OR REPLACE VIEW viewtest_v41 (empno, empname,deptno)
           AS SELECT  id, last_name, dept_id 
           FROM viewtest WHERE dept_id = 41
           WITH READ ONLY;
SQL> UPDATE viewtest_v41 SET empname = 'XXXX';
(* 에러 발생)
SQL> CREATE OR REPLACE VIEW viewtest_v41 (empno, empname,deptno)
           AS SELECT  id, last_name, dept_id 
           FROM viewtest WHERE dept_id = 41;
SQL> UPDATE viewtest_v41 SET empname = 'XXXX';  
SQL> SELECT * FROM viewtest_v41;
SQL> SELECT * FROM viewtest;
SQL> CREATE OR REPLACE VIEW viewtest_v41
           AS SELECT  id, last_name, dept_id 
           FROM viewtest WHERE dept_id = 41
           WITH CHECK OPTION CONSTRAINT viewtest_v41_ck;
SQL> SELECT * FROM viewtest_v41;
SQL> UPDATE viewtest_v41 SET dept_id = 31; 
(* 에러 발생)
SQL> INSERT INTO viewtest_v41 VALUES ( 1000, 'AAAA', 1000);  
(* 에러 발생)
SQL> INSERT INTO viewtest_v41 VALUES ( 2000, 'AAAA', 41);
SQL> SELECT * FROM viewtest_v41;
SQL> INSERT INTO (SELECT id, last_name, dept_id FROM s_emp
            WHERE dept_id=31 WITH CHECK OPTION)   VALUES (62, user,32);
(* 에러 발생. )
SQL> UPDATE(SELECT id, last_name, dept_id FROM s_emp
           WHERE dept_id=31 WITH CHECK OPTION)  SET last_name = 'yyyy'  WHERE id = 60;
SQL> UPDATE(SELECT id, last_name, dept_id FROM s_emp
            WHERE dept_id=31 WITH CHECK OPTION)   SET dept_id = 32;
(* 에러 발생.)
 
 
 
- 작성 한 뷰 조회
SELECT  object_name, created, status
          FROM     user_objects
          WHERE  object_type = 'VIEW';

          SELECT  view_name, text
          FROM     user_views;
 




    Spring3.X, MyBatis, Hibernate실무과정 5일 35시간   10-21
    자바초보에서안드로이드까지 18일 54시간   10-22
    JAVA&WEB프레임워크실무과정 33일 99시간   10-24
    Spring3.X, MyBatis, Hibernate실무과정 12일 36시간   10-25
    자바초보에서안드로이드까지 8일 56시간   10-26
    Spring3.X, MyBatis, Hibernate실무과정 5일 35시간   10-27
    JAVA&WEB프레임워크실무과정 14일 98시간   10-27

    댓글 없음:

    댓글 쓰기