Oracle DB, Oracle APEX, Linux etc.

суббота, 19 декабря 2009 г.

Oracle APEX: 4.0 Early Adopter Now!

Ну, кто ещё не слышал, для тех новость: попробовать APEX 4.0 можно уже сейчас - http://tryapexnow.com/.

Всем приятного тестирования!
Читать далее

четверг, 3 декабря 2009 г.

Oracle DB 11gR2: New features, new bugs...

Недавно наткнулся на новоприобретённый баг, появившийся в Oracle DB 11.2.0.1: MERGE позволяет обходить ограничения-проверки (CHECK CONSTRAINTS), изменяя данные.

Вот тестовый скрипт:

drop table test_merge;

create table test_merge as select 1 m, 2 n from dual;

alter table test_merge add constraint test_merge_chk check (m <= n);

update test_merge set n = m - 1;

rollback;

select * from test_merge;

merge into test_merge tgt
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n;

commit;

select * from test_merge;


И вот результат:


Таблица создана.


Таблица изменена.

update test_merge set n = m - 1
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)



Откат завершен.


M N
---------- ----------
1 2


1 строка объединена.


Фиксация обновлений завершена.


M N
---------- ----------
1 0


Как оказалось, этот баг не проявляется, если указать ветку WHEN NOT MATCHED в операторе MERGE. Так что обход бага в случае, когда нужно только обновить данные, но не вставлять новые, прост:
merge into test_merge tgt 
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n
when not matched then insert (m) values(null) where 1 = 0;

Главное, чтобы никто не "соптимизировал" этот MERGE, удалив "лишнюю" ветку. ;)

Читать далее

вторник, 1 декабря 2009 г.

Oracle APEX: Скрывать регион с отчётом без данных

Итак, у Вас есть регион с отчётом, и Вы не хотите показывать этот регион, если в отчёте нет данных (то есть, запрос отчёта не вернул ни одной строки). Вроде всё просто:

0. Указываете Static ID в атрибутах региона с отчётом. Например, HIDING_REGION.
1. В атрибутах отчёта вставляете следующее в When No Data Found Message:




И всё! :) Скрипт вставится в получаемую страницу (а значит, и выполнится) только тогда, когда запрос для отчёта не вернёт строк.
Читать далее