2013년 10월 16일 수요일

오라클 뷰에 대하여 oracle view 뷰(View) - 하나또는 그 이상의 테이블이나 뷰를 ...

오라클 뷰에 대하여 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;
 

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  



댓글 없음:

댓글 쓰기