оракул: почему я не могу вставить в поле зрения - PullRequest
0 голосов
/ 18 февраля 2011

Я создал простое представление со столбцами из одной таблицы. Когда я пытаюсь вставить значения в таблицу, я получаю ошибку 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 ]

2 голосов
/ 18 февраля 2011

Вы уверены, что 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 голос
/ 18 февраля 2011

Вы правы, что представление с предложением ORDER BY по своей природе не может быть обновлено. Все, что вам нужно сделать, это создать триггер INSTEAD OF в представлении, чтобы выполнить нужную вставку. Например: допустим, у вас есть представление ACTIVE_CUST_VIEW для таблицы ALL_CUST

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