Вообще это продолжение темы поднятой ранее, но я повторюсь, поскольку могу подробней сформулировать вопрос.
Есть таблица:
create tabe ROUTE_ORDERS(
ROUTE_ORDERS_TYPE INTEGER, /* FK на справочник маршрутов*/
ROUTE_ORDERS_OBJECT INTEGER, /* FK на справочник объектов */
ROUTE_ORDERS_ORDINAL INTEGER /* Порядковый номер объекта в маршруте*/
); |
при этом определены ограничения:
ALTER TABLE ROUTE_ORDERS ADD CONSTRAINT UK1 UNIQUE (ROUTE_ORDERS_TYPE, ROUTE_ORDERS_OBJECT); |
Физический смысл: в маршруте не может встречаться объект более одного раза.
ALTER TABLE ROUTE_ORDERS ADD CONSTRAINT UK2 UNIQUE (ROUTE_ORDERS_TYPE, ROUTE_ORDERS_ORDINAL); |
Физический смысл: объекты в маршруте не могут иметь одинаковые порядковые номера.
Моя задача написать интерфейсные ХП для работы с этой таблицей.
Пока необходимы следующие ХП:
ADD_TO_ROUTE(ROUTE_ID, OBJECT_ID) - добавить объект в конец маршрута
DEL_FROM_ROUTE(ROUTE_ID, OBJECT_ID) - удалить объект из маршрута
UP_IN_ROUTE(ROUTE_ID, OBJECT_ID) - поднять объект вверх по списку
DOWN_IN_ROUTE(ROUTE_ID, OBJECT_ID) - опустить вниз по списку
я попытался воспользоваться методом блокировки одновременного вызова ХП, подсказанного мне в
http://www.sql.ru/forum/actualthread.aspx?id=2&tid=195934 - запись в таблицу с последующим удалением некого синтетического значения:
create procedure ADD_TO_ROUTE(ROUTE_ID integer, OBJECT_ID integer) as
declare variable t integer;
begin
insert into ROUTE_ORDERS values (:ROUTE_ID, -1, -1);
select max(ROUTE_ORDERS_ORDINAL) FROM ROUTE_ORDERS
where ROUTE_ORDERS_TYPE = :ROUTE_ID and ROUTE_ORDERS_OBJECT = :OBJECT_ID
into t;
IF (t IS NULL) THEN t = 1;
INSERT INTO ROUTE_ORDERS values (:ROUTE_ID, OBJECT_ID, t+1);
DELETE FROM ROUTE_ORDERS
where ROUTE_ORDERS_TYPE = :ROUTE_ID and ROUTE_ORDERS_OBJECT = -1;
end^ |
Но попытка выполнить
execute procedure add_to_route(1, 100);
execute procedure add_to_route(1, 101); |
вызывает срабатывание UK2.
Подскажите как это обойти.