2011-02-17 84 views
0

我創建了一個簡單的視圖,其中包含來自單個表的列。當我嘗試向表格中插入值時,我得到了這個視圖中dml不合法的ORA_01732錯誤。我在視圖定義中有一個order by子句,我收集的這個子句是不允許的,因爲它本質上是可更新的,而且我看到我可能必須在視圖定義中使用INSTEAD OF類型子句。有人能告訴我如何以這種方式構建可更新的視圖嗎?oracle:爲什麼我不能插入視圖

這裏是創建視圖的語句:

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

你不得不發佈CREATE VIEW語句讓我們能夠就如何使它更新。在視圖中的「ORDER BY」是非常有問題的,而不是推薦的做法。 – 2011-02-17 22:38:30

+0

爲什麼有人會在視圖中使用訂單? – 2011-02-17 22:59:14

回答

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; 

以上陳述與在Oracle 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 
1

你是正確的,有順序的圖BY子句是不是天生更新。你所要做的就是在視圖上創建一個INSTEAD OF觸發器來執行你想要的INSERT。 例如:比方說你有表ALL_CUST視圖ACTIVE_CUST_VIEW

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; 
/