2011-02-17 7 views
0

단일 테이블의 열이있는 간단한보기를 만들었습니다. 테이블에 값을 삽입하려고하면이 뷰에서 dml이 유효하지 않다는 ORA_01732 오류가 발생합니다. 나는 수집 한 뷰 정의에서 order by 절을 본질적으로 업데이트 할 수 없으며 뷰 정의에 INSTEAD OF 절을 사용해야한다는 것을 알게되었습니다. 누군가가이 방법으로 업데이트 가능하게보기를 빌드하는 방법을 보여줄 수 있습니까? 당신이 order by이 관찰의 원인인지 확인oracle :보기에 삽입 할 수없는 이유는 무엇입니까

create view CUST_VIEW 
as select customer#,firstname,lastname,state 
from book_customer 
order by state, lastname; 
+3

당신은 VIEW를 CREATE 문을 게시해야 할 것 테이블 ALL_CUST에보기 ACTIVE_CUST_VIEW이 있다고 할 수 있습니다. 보기에서 '주문'은 매우 의심 스럽지만 권장되는 방법은 아닙니다. –

+0

누구나보기에서 주문을 사용하는 이유는 무엇입니까? –

+1

각 상태 내에서 성으로 주문하도록보기를 정의하라고 지시하는 숙제. 업데이트 된 질문을 생성보기 – Sinaesthetic

답변

2

위치 : 여기

은보기 만들기 문입니까?

나는 order by 절과 함께보기에 삽입을 수행 할 수 있습니다

create table tq84_table (
    a number, 
    b number 
); 

create view tq84_updateable_view as 
select a, b from tq84_table 
order by a; 


insert into tq84_table values (4,1); 
insert into tq84_table values (1,4); 
insert into tq84_table values (3,9); 
insert into tq84_table values (7,5); 

select * from tq84_updateable_view; 

insert into tq84_updateable_view values (1,9); 

select * from tq84_updateable_view; 

위의 문은 오라클 11 R2에서 문제없이 실행합니다.

당신은 당신에 삽입 할 수있는 열 USER_UPDATABLE_COLUMNS 확인 할 수 있습니다 :

SQL> select * from user_updatable_columns where table_name = 'TQ84_UPDATEABLE_VIEW'; 

OWNER       TABLE_NAME      COLUMN_NAME     UPD INS DEL 
------------------------------ ------------------------------ ------------------------------ --- --- --- 
RENE       TQ84_UPDATEABLE_VIEW   A        YES YES YES 
RENE       TQ84_UPDATEABLE_VIEW   B        YES YES YES 
+0

나는 user_updatable_coumns을 확인하고 그것을 업데이 트하려는 각 열은 업데이트 할 수 있지만 여전히 그 오류가 – Sinaesthetic

+0

또한 삽입 할 수 있다고 말한다 – Sinaesthetic

1

당신은 맞다 ORDER BY 절과 함께 뷰가 본질적으로 업데이트 할 수 없습니다 것을. 뷰에 INSTEAD OF 트리거를 작성하여 원하는 INSERT를 실행하면됩니다. 예 : 당신은 우리가 그것을 갱신하는 방법을 조언 할 수 있도록하기위한

CREATE OR REPLACE TRIGGER INS_NEW_CUST_VIEW 
INSTEAD OF INSERT 
ON ACTIVE_CUST_VIEW 
FOR EACH ROW 
BEGIN 
INSERT INTO ALL_CUST (CUST_ID,CUST_NAME,START_DATE) VALUES (:NEW.CUST_ID,:NEW.CUST_NAME,:NEW.START_DATE); 
END INS_NEW_CUST_VIEW; 
/
관련 문제