oracle:为什么我无法插入到视图中

时间:2011-02-17 22:22:32

标签: sql oracle view insert

我使用单个表中的列创建了一个简单视图。当我尝试在表中插入值时,我得到ORA_01732错误,dml在此视图上不合法。我在视图定义中有一个order by子句,我收集的不允许它本身可更新,我看到我可能必须在视图定义中使用INSTEAD OF类型子句。有人可以告诉我如何构建视图以便以这种方式更新吗?

这是创建视图语句:

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

2 个答案:

答案 0 :(得分:2)

您确定order by是您观察的原因吗?

我可以使用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 :(得分:1)

使用ORDER 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;
/