Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 novalidate + virtual columns = bug?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
create table t1
(
dummy varchar2(2) not null,
sign generated always as (case when dummy = 'X' then 1 else -1 end) virtual
);

Table created.


alter table t1 add constraint uk_t1 unique (sign);

Table altered.


create table t2
(
value number not null,
sign generated always as (case when value > 0 then 1 else 0 end) virtual
);

Table created.
virtual 

alter table t2 add constraint fk_t2_t1 foreign key (sign)
references t1(sign)
enable novalidate;

Table altered.


insert into t1(dummy) select * from dual union select 'Y' from dual;

2 rows created.


insert into t2(value) select 1 from dual union select 0 from dual;

2 rows created.


select *
from t1
full join t2 on t1.sign = t2.sign;

DU       SIGN      VALUE       SIGN
-- ---------- ---------- ----------
                       0          0
X           1          1          1
Y          -1
17 янв 12, 15:38    [11918633]     Ответить | Цитировать Сообщить модератору
 Re: novalidate + virtual columns = bug?  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Можно проще, novalidate тут не при чем.

drop table t2 purge;
drop table t1 purge;
create table t1(id number unique);
create table t2
(
  value number not null,
  id generated always as (value+0) virtual references t1 (id)
);
insert into t1 select level from dual connect by level < 3;
insert into t2(value) select (level-1) from dual connect by level < 3;
--insert into t2(value) select (2-level) from dual connect by level < 3;


Ошибки не возникает если последнее значение в insert from select не вызывает исключеия.
17 янв 12, 16:24    [11919160]     Ответить | Цитировать Сообщить модератору
 Re: novalidate + virtual columns = bug?  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Волшебное число - 256 :)

SQL> drop table t2 purge;
 
Table dropped
SQL> drop table t1 purge;
 
Table dropped
SQL> create table t1(id number unique);
 
Table created
SQL> create table t2
  2  (
  3    value number not null,
  4    id generated always as (value+0) virtual references t1 (id)
  5  );
 
Table created
SQL> insert into t1 select level from dual connect by level < 3;
 
2 rows inserted
SQL> insert into t2(value) select -level from dual connect by level <= 255 union all select 1 from dual;
 
256 rows inserted
SQL> insert into t2(value) select -level from dual connect by level <= 256 union all select 1 from dual;
 
insert into t2(value) select -level from dual connect by level <= 256 union all select 1 from dual
 
ORA-02291: integrity constraint (LB.SYS_C0054684) violated - parent key not found
17 янв 12, 16:28    [11919217]     Ответить | Цитировать Сообщить модератору
 Re: novalidate + virtual columns = bug?  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Есть баг Bug 8460004: ORA-02291 AFTER COMMIT ON TABLE WITH VIRTUAL COLUMNS в котором вскользь упоминается некая оптимизация, которую можно отключить создав триггер-пустышку
create or replace trigger ar_workaround
after insert on t2 for each row
begin
  null;
end;
/
17 янв 12, 16:42    [11919394]     Ответить | Цитировать Сообщить модератору
 Re: novalidate + virtual columns = bug?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
_Nikotin
Есть баг Bug 8460004: ORA-02291 AFTER COMMIT ON TABLE WITH VIRTUAL COLUMNS в котором вскользь упоминается некая оптимизация, которую можно отключить создав триггер-пустышку
create or replace trigger ar_workaround
after insert on t2 for each row
begin
  null;
end;
/

жуть какая. погремушки, которые лечить пустышками.. совсем они там офигели

а харе кришна, харе,харе,харе, харе,харе, харе,харе,харе..
17 янв 12, 17:16    [11919761]     Ответить | Цитировать Сообщить модератору
 Re: novalidate + virtual columns = bug?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
_Nikotin
Можно проще, novalidate тут не при чем.
Действительно... хотя почему-то мне казалось, что он роль играет, но счас повторить не удалось.
На самом деле в моем случае t2 - здоровеннейшая таблица фактов в которую льются каждый день с помощью и direct path load и conventional load сотни тысяч строк.
Соответственно триггер - явно не выход.
17 янв 12, 18:37    [11920408]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить