레이블이 #ORACLEVIEW인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #ORACLEVIEW인 게시물을 표시합니다. 모든 게시물 표시

2021년 11월 19일 금요일

오라클 단순 뷰(Oracle Simple View)

 

오라클 단순 뷰(Oracle Simple View)


뷰에 포함된 테이블을 기반으로 뷰에 포함 된 테이블을 기반으로 단순 뷰simple view와 복합 뷰complex view로 구분할 수 있습니다.


단순 뷰는 BASE TABLE이 하나인 경우이며 단순히 컬럼을 나열한 것으로 행번호rownum, DISTINCT, 표현식expression, 조인, 함수, 집합함수(SUM, MAX, MIN, AVG, COUNT), GROUP BY를 사용하지 않으므로 뷰를 통한 DML(Insert, Update, Delete)이 가능 합니다. 또한 BASE TABLE의 NOT NULL 컬럼을 포함하지 않습니다.


뷰가 조인조건, 집합함수(SUM, MAX, MIN, AVG, COUNT), GROUP BY 구, DISTINCT를 포함하는 경우 행row(로우)을 삭제할 수 없습니다.

뷰가 조인조건, 집합함수, GROUP BY 구, DISTINCT, 표현식(EXPRESSION)으로 정의된 컬럼을 포함하는 경우 행을 수정할 수 없습니다.

뷰가 조인조건, 집합함수, GROUP BY 구, DISTINCT, 표현식으로 정의된 컬럼, View로 선택되지 않은 NOT NULL칼럼을 포함하는 경우 행을 입력할 수 없습니다.


EMP 테이블을 통해 단순 뷰를 만들고 딕셔너리 뷰에서 확인을 하는 실습을 해보겠습니다.

실습


단순 뷰를 생성해 보겠습니다.

EMP 테이블에서 20번 부서 사원의 사번(empno, 이름(ename), 직무(job), 부서(deptno)를 정의하는 V_EMP20 이라는 이름의 단순 뷰를 작성 하세요.


CREATE OR REPLACE VIEW V_EMP20

AS

SELECT EMPNO, ENAME, JOB, DEPTNO 

FROM EMP 

WHERE DEPTNO = 20;


<실행결과>

View V_EMP20이(가) 생성되었습니다.


OR REPLACE구는 이미 있다면 대체하라는 의미로 기존에 V_EMP20 뷰가 있더라도 오류는 발생하지 않습니다.


생성된 뷰를 통해 데이터를 조회해 보겠습니다.


V_EMP20를 통해 데이터를 조회하세요.


SELECT * FROM V_EMP20;


<실행결과>

 

EMPNO

ENAME

JOB

DEPTNO

1

7369

SMITH

CLERK

20

2

7566

JONES

MANAGER

20

3

7788

SCOTT

ANALYST

20

4

7876

ADAMS

CLERK

20

5

7902

FORD

ANALYST

20



USER_VIEWS 딕셔너리 뷰를 통해 사용자가 생성한 뷰 정보를 조회할 수 있는데,  V_EMP20 뷰 생성 정보를  조회해 보겠습니다.


V_EMP20의 생성 SQL 스크립트를 조회 하세요.


SELECT TEXT 

FROM    USER_VIEWS 

WHERE  VIEW_NAME = 'V_EMP20';


<실행결과>


 

TEXT

1

SELECT EMPNO, ENAME, JOB, DEPTNO  FROM EMP WHERE DEPTNO = 20


USER_DEPENDENCIES 딕셔너리 뷰는 객체간 참조하는 정보를 조회할 수 있는데 이를 통해 뷰의 BASE TABLE과의 의존관계를 확인 할 수 있습니다.


V_EMP20의 의존관계를 조회하세요.


SELECT NAME, TYPE, REFERENCED_OWNER, REFERENCED_NAME

             , REFERENCED_TYPE FROM USER_DEPENDENCIES

WHERE NAME = 'V_EMP20'

AND       TYPE = 'VIEW';


<실행결과>

 

NAME

TYPE

REFERENCED_OWNER

REFERENCED_NAME

REFERENCED_TYPE

1

V_EMP20

VIEW

SCOTT

EMP

TABLE


USER_DEPENDENCIES 뷰의 NAME은 객체명, TYPE은 객체 타입, REFERENCED_OWNER는 의존객체인 EMP의 소유자, REFERENCED_NAME은 의존하는 객체명인 BASE TABLE의 이름을 나타내며, REFERENCED_TYPE은 BASE TABLE의 TYPE을 표시합니다.



앞에서 생성한 뷰를 통해 데이터를 입력/수정/삭제 후 뷰를 삭제해 보겠습니다..

실습


뷰를 통해 데이터를 입력 합니다.


V_EMP20 뷰를 통해 empno(9999), ename(홍길동), job(SALESMAN), deptno(10) 데이터를 입력하세요.


INSERT INTO V_EMP20 VALUES (9999,'홍길동','SALESMAN', 10);


<실행결과>

1 행 이(가) 삽입되었습니다.


V_EMP20 뷰는 EMP 테이블을 BASE TABLE로 해서 20번 부사원들을 SELECT 하여 작성된 뷰 입니다. 그런데 10 번 부서원인 9999/홍길동 사원이 잘 입력 되며, 입력된 사원은  V_EMP20 뷰를 조회하면 조회되지 않고 EMP 테이블을 SELECT 해보면 확인할 수 있습니다.


V_EMP20 뷰를 SELECT 해 보겠습니다.



V_EMP20 뷰에서 입력된 9999/홍길동 사원을 확인하세요.


SELECT * FROM V_EMP20;


<실행결과>

 

EMPNO

ENAME

JOB

DEPTNO

1

7369

SMITH

CLERK

20

2

7566

JONES

MANAGER

20

3

7788

SCOTT

ANALYST

20

4

7876

ADAMS

CLERK

20

5

7902

FORD

ANALYST

20


9999/홍길동 사원은 조회되지 않습니다.


EMP 테이블을 SELECT 해 보겠습니다.


EMP 테이블에서 입력된 9999/홍길동 사원을 확인하세요.


SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP;


<실행결과>

 

EMPNO

ENAME

JOB

DEPTNO

1

7369

SMITH

CLERK

20

2

7499

ALLEN

SALESMAN

30

...

...

...

...

...

14

7934

MILLER

CLERK

10

15

9999

홍길동

SALESMAN

10


9999/홍길동 사원이 맨 아래 조회 됩니다. 이 데이터가 V_EMP20 뷰를 통해 입력이 되었지만 아쉬운 부분도 있습니다. 이 뷰는 EMP 테이블에서 20번 부서원들을 보여주는 가상 테이블 역할을 하는데 뷰를 통해 20 번 부서원이 아닌 다른 부서원이 입력되는 것이 꺼림직 합니다. 그래서 V_EMP20 뷰를 통해서는 20 부서원들만 입력이 되도록 하고 싶습니다. 


9999/홍길동 사원 데이터를 삭제하고 WITH CHECK OPTION을 사용하여 V_EMP20 뷰를 재작성 합니다.


EMP 테이블에서 9999/홍길동 데이터를 삭제합니다.


DELETE FROM EMP WHERE EMPNO = 9999;


<실행결과>

1 행 이(가) 삭제되었습니다.


WITH CHECK OPTION 옵션은 뷰가 SELECT 할 수 있는 20번 부서 데이터만 입력이 가능하도록 하고 수정도 20번 부서코드가 아닌 다른 부서코드로 수정을 못하도록 합니다.


WITH CHECK OPTION을 사용하여 V_EMP20 뷰를 다시 작성하세요.


CREATE OR REPLACE VIEW V_EMP20

AS

SELECT EMPNO, ENAME, JOB , DEPTNO

FROM EMP

WHERE DEPTNO = 20

WITH CHECK OPTION;


<실행결과>

View V_EMP20이(가) 생성되었습니다.


WITH CHECK OPTION으로 생성된 제약조건을 확인 해 보겠습니다.


USER_CONSTRAINTS 뷰를 통해 생성된 제약조건을 확인 하세요.


SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, STATUS

FROM USER_CONSTRAINTS

WHERE TABLE_NAME = 'V_EMP20';


<실행결과>

 

CONSTRAINT_NAME

CONSTRAINT_TYPE

TABLE_NAME

STATUS

1

SYS_C007664

V

V_EMP20

ENABLED


CONSTRAINT_TYPE의 ‘V’는 VIEW임을 나타내고 현재 상태는 활성화(ENABLES) 상태 입니다. 생성 시 WITH CHECK OPTION 다음에 CONSTRAINT구를 사용하여 제약조건 이름을 기술하지 않았으므로 제약조건의 이름(CONSTRAINT_NAME)은 오라클에서 임의로 부여 하였습니다.


뷰를 통해 데이터를 입력 합니다.


V_EMP20 뷰를 통해 empno(9999), ename(홍길동), job(SALESMAN), deptno(10) 데이터를 입력하세요.


INSERT INTO V_EMP20 VALUES (9999,'홍길동','SALESMAN', 10);


<실행결과>

ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다.


10번 부서원은 V_EMP20 뷰가 SELECT 할 수 있는 데이터가 아니므로 입력이 불가능 합니다.


뷰를 통해 데이터를 수정 합니다.


V_EMP20 뷰를 통해 7369/SMITH 사원의 부서를 10으로 변경하세요.


UPDATE V_EMP20

SET      DEPTNO = 10

WHERE  EMPNO = 7369;


<실행결과>

ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다


7369/SMITH 사원의 원래 부서는 20번이고 이를 10번으로 변경하고자 했으나 WITH CHECK OPTION으로 생성된 뷰 이므로 다른 부서로 수정이 불가능 합니다. 20번 부서로 수정은 가능하니 직접해보세요. 하지만 20번 부서원을 20번으로 수정하는 것이 의미는 없겠죠. 


뷰를 통해 9999/홍길동 데이터를 입력하는데 이번에는 20번 부서로 입력 합니다.


V_EMP20 뷰를 통해 empno(9999), ename(홍길동), job(SALESMAN), deptno(20) 데이터를 입력하세요.


INSERT INTO V_EMP20 VALUES (9999,'홍길동','SALESMAN', 20);


<실행결과>

1 행 이(가) 삽입되었습니다.


뷰의 SELECT 쿼리가 조회할 수 있는 데이터 이므로 잘 입력됩니다.


뷰를 통해 9999/홍길동 데이터의 직무(job)를 “MANAGER”로 변경 합니다.


V_EMP20 뷰를 통해 9999/홍길동 사원의 직무(job)를 “MANAGER”로 변경하세요.


UPDATE V_EMP20

SET        JOB = 'MANAGER'

WHERE  EMPNO = 9999;


<실행결과>

1 행 이(가) 업데이트되었습니다.


뷰를 통해 7499/ALLEN 사원의 직무(job)를 “MANAGER”로 변경 합니다. 7499 사원은 30번 부서코드를 가지고 있습니다.


V_EMP20 뷰를 통해 7499/ALLEN 사원의 직무(job)를 “MANAGER”로 변경하세요.


UPDATE V_EMP20

SET        JOB = 'MANAGER'

WHERE  EMPNO = 7499;


<실행결과>

0개 행 이(가) 업데이트되었습니다.


7499/ALLEN 사원은 30번 부서원이고 V_EMP20 뷰가 SELECT 할수 있는 데이터가 아니므로  WHERE절의 조건이 맞지않아 수정되는 행은 없습니다.


뷰를 통해 9999/홍길동 사원의 데이터를 삭제 합니다.


V_EMP20 뷰를 통해 9999/홍길동 사원의 데이터를 삭제하세요.


DELETE FROM V_EMP20 

WHERE EMPNO = 9999;


<실행결과>

1 행 이(가) 삭제되었습니다.


20번 부서원이므로 잘 삭제 됩니다.


뷰를 통해 7499/ALLEN 사원을 삭제해 보겠습니다. 7499 사원은 30번 부서코드를 가지고 있습니다.


V_EMP20 뷰를 통해 7499/ALLEN 사원의 직무(job)를 “MANAGER”로 변경하세요.


DELETE FROM V_EMP20 

WHERE EMPNO = 7499;


<실행결과>

0개 행 이(가) 삭제되었습니다.


7499/ALLEN 사원은 30번 부서원이고  V_EMP20 뷰가 SELECT 할 수 있는 데이터가 아니므로 WHERE절의 조건이 맞지않아 삭제되는 행은 없습니다.


뷰를 삭제해 보겠습니다.


V_EMP20 뷰를 삭제하세요.


DROP VIEW V_EMP20;


<실행결과>

View V_EMP20이(가) 삭제되었습니다.



#SimpleView, #단순뷰, #오라클뷰, #ORACLEVIEW, #오라클교육, #오라클강좌

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...