안녕하세요. 오라클 생초보가 질문 하나드립니다 0 7 9,830

by 잠만자 [Oracle 기초] view ORA-01733 [2012.03.14 18:11:56]


안녕하세요
한창 scott/tiger 로오 라클 공부중인 학생입니다
너무 기초적인 질문 같아서 올리기 좀 부끄럽네요 ^^;;


오라클클럽에 있는 강좌중에 "view 테이블" 강좌를 보던중에

create or replace view test
as
    select e.empno, d.deptno
    from emp e, dept d
    where e.deptno = d.deptno
    with check option

위와 같은 뷰를 만들었습니다.
(empno,deptno 은 각각의 테이블의 기본키)

그리고선 

insert into test
values(1234,10)

를 실행하였더니 

"ORA-01733: 가상 열은 사용할 수 없습니다"

라고 나오네요. 두 테이블을 조인하여 만든 뷰에는 값을 추가 할수 없는건가요?
by 부쉬맨 [2012.03.14 18:25:43]
뷰의 의미는 만드신쿼리에 있는내용을 보시는용입니다.

말그대로 매번 저쿼리를 날려서 보는거면
뷰를만들어서 간단히 보자라는 의미겠지요

위의 내용으로 보면 뷰에는 정보가 들어갈수없겠지요
조회되고있는 각테이블의 내용이 추가되면
해당추가된 내용을 볼수있습니다.

뷰는 dml이 될수없습니다.

by 마농 [2012.03.14 18:41:23]

부쉬맨님~ 아닙니다. 뷰도 DML 됩니다.

테스트해보니 재미있는 결과가 나오네요.
11g 에서는 에러 안나네요.
10g 에서는 에러가 나구요.
실행계획을 비교해 봤더니
11g 에서는 fk_dept 인덱스를 이용하여
deptno가 널이 아닌 rowid 를 가져와 emp 테이블을 스캔합니다.
즉, d.deptno 를 읽지 않는 것이죠.
아마 실행쿼리가 변형되어 d.deptno 가 e.deptno 로 봐뀌었을 듯 하네요.
혹시나 해서 fk_deptno 인덱스를 삭제하고 했더니.
그냥 emp 풀스캔 하네요. 역시나 dept 테이블은 읽지 않습니다.
결론은 d.deptno 가 e.deptno 로 바뀌어
두개 컬럼이 모두 emp의 컬럼이 되며 Insert 를 수행하면 문제 없이 emp로 입력됩니다.
그러나 10g의 실행계획을 확인해 보면
dept 테이블이나 인덱스를 읽어 emp 와 조인합니다.
즉, d.deptno 는 dept의 컬럼이고 e.empno 는 emp 의 컬럼인거죠.
쿼리 변형이 읽어나지 않았습니다.
두개 컬럼이 서로 다른 테이블을 바라보고 잇어서 입력이 안됩니다.
쿼리를 d.deptno 대신 e.deptno 로 바꾸시면 입력됩니다.

by 잠만자 [2012.03.14 19:18:40]
허접한 질문임에도 답변해주신 선배님들 정말 감사합니다 (__)

제가 현재 사용하고 있는게 10g버젼이라서 아무래도 조인한 뷰에서 DML을 사용하는건 자제해야겟네요

by 마농 [2012.03.15 08:35:31]

두개 테이블 조인이 들어가 경우 다 안되는 건 아닙니다.
With Check Option 이 들어간 경우 위와 같은 에러가 나구요.
해당 옵션이 빠진 뷰라면 두개 테이블 조인이 된 경우라도 DML 이 가능합니다.
몇가지 제약이 없는건 아니지만서도 위와 같이 원천 봉쇄하지는 않습니다.
조인관계가 emp : dept = m : 1 조인입니다.
이경우 emp는 행이 그대로 유지가 되지만 dept는 emp 행만큼 늘어나지요.
이런 뷰에 DML 을 수행할 수 있는 것은 emp 컬럼만 가능합니다. dept컬럼은 안되구요.
만약 m:m 조인이나 Group By 등 원래 레코드를 보존할 수 없는 경우라면 DML은 불가합니다.

by 부쉬맨 [2012.03.15 09:21:27]
버전이 올라가면되 대는건가...
9i버전에서는 안되는걸로 알고있어서
상위버전도 같은거라는 생각을했네요
감사합니당.

by 마농 [2012.03.15 09:25:56]

버전이 올라가서 된는게 아니라 원래부터 되는건데...
여러가지 제약조건이 있어 안되는 경우가 많지.
무조건 안된다고 생각하면 오산~

by 손님 [2012.03.15 16:26:20]
마농 / 아...m:1 관계라는걸 생각하니 확실히 안되겟네요. 11g에선 프로그램에서 알아서 m쪽 테이블로 인식하고선 넣어주는거구요. 정말 감사합니다 (__)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입