Descobri o que pode ter acontecido!!
Leiam até o final...
SQL> create table x (x1 number, x2 number);
Table created.
SQL> insert into x values (1,1);
SQL> insert into x values (1,2);
SQL> insert into x values (2,1);
SQL> insert into x values (1,1);
...
SQL> create table y (y1 number, y2 number);
Table created.
SQL> insert into y values (1,2);
1 row created.
SQL> create view xx as select distinct x1,x2 from x;
View created.
SQL> create view xy as select x1,x2 from x minus select y1,y2 from y;
View created.
SQL> insert into xx values (3,3);
insert into xx values (3,3)
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
SQL> insert into xy values (3,3);
insert into xy values (3,3)
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
! ! ! ! !
Até aqui eu estava xingando o CESPE e dando graças a Deus por não ter feito esta prova, mas ao analisar mais atentamente a situação:
FATO: Não era pegadinha, a questão originalmente estava CERTA e o CESPE alterou para ERRADO, justificando que era possível incluir dados em views com DISTINCT e MINUS.
Conclui-se então que algum candidato que originalmente errou a questão (marcando "E") deu um jeito de fazer um INSERT em uma view com DISTINCT ou MINUS, e eu tratei de encontrar um jeito de tornar isso possível.
Encontrei não somente um, mas DOIS jeitos:
! ! ! ! !
Jeitinho No. 1: No enunciado não diz que a view necessariamente tem DISTINCT ou MINUS na query principal. Estes operadores podem estar em subqueries! A view desta forma tem DISTINCT e MINUS, e sendo a query principal uma query simples, a view aceita INSERT:
SQL> create view xupd as select x1,x2 from x
2 where (x1,x2) not in (select distinct y1,y2 from y)
3 and x2 in (select x1 from y minus select y2 from y);
View created.
SQL> select * from xupd;
X1 X2
---------- ----------
1 1
1 1
SQL> insert into xupd values (3,3);
1 row created.
! ! ! ! !
Jeitinho No. 2: No Oracle é possível criar triggers INSTEAD OF para views, que executam um código PL/SQL quando o usuário tenta fazer um INSERT na view, ao invés de fazer o INSERT diretamente. Fica assim:
SQL> create or replace trigger xxio instead of insert on xx
2 referencing new as new old as old
3 begin
4 insert into x values (:new.x1, :new.x2);
5 end;
6 /
Trigger created.
SQL> insert into xx values (4,4);
1 row created.
SQL> commit;
Commit complete.
RÁÁÁÁÁÁ!!!