Генерация уникального значения большего некоторого числа.

Pavel Kilevatyh
Дата: 23.09.2005 17:16:58
Вообще это продолжение темы поднятой ранее, но я повторюсь, поскольку могу подробней сформулировать вопрос.
Есть таблица:
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.
Подскажите как это обойти.
Pavel Kilevatyh
Дата: 23.09.2005 17:34:02
Pavel Kilevatyh
INSERT INTO ROUTE_ORDERS values (:ROUTE_ID, OBJECT_ID, t+1);


если б вместо грубого t+1, заносить уникальное число превышающее t было бы здорово, но не знаю как это сделать.
Мимопроходящий
Дата: 23.09.2005 17:36:54

Привет, Pavel!
Ты пишешь:

Pavel
PK> если б вместо грубого t+1, заносить уникальное число превышающее t
было бы здорово, но не знаю как это сделать.
Чем тебе генераторы не угодили?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

Pavel Kilevatyh
Дата: 23.09.2005 17:55:37
Мимопроходящий

Чем тебе генераторы не угодили?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3


Генераторы я очень люблю, но в данной задаче может понадобиться переместить объект вверх/вниз по маршруту. Перемещение производится изменением порядкового номера ROUTE_ORDERS_ORDINAL объекта.
Как в этом случае применить генератор - я не вижу.
Мимопроходящий
Дата: 23.09.2005 17:59:42

Привет, Pavel!
Ты пишешь:

Pavel
PK> Генераторы я очень люблю, но в данной задаче может
PK> понадобиться переместить объект вверх/вниз по маршруту.
PK> Перемещение производится изменением порядкового номера ROUTE_ORDERS_ORDINAL объекта.

Перемещение подразумевает "обмен местами" двух и более объектов.
Где проблема?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

Pavel Kilevatyh
Дата: 23.09.2005 18:30:04
Мимопроходящий

Перемещение подразумевает "обмен местами" двух и более объектов.
Где проблема?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3


Да обмен местами.
Не вижу как можно применить генератор в этом случае.
Как я знаю у генератора есть метод создания:
create denerator gen_name;
метод установки значения
set generator gen_name to <число>
Метод получения следующего значения
gen_id(gen_name, (+/-)<шаг изменения>)

Установить значение генератора в ХП я не могу, следовательно не могу получить уникальное значение, превышающее заданное число.
Поскольку ко-во маршрутов не определено и не ограниченно, но создавать по генератору на маршрут не удастся.

Где же я туплю?
Мимопроходящий
Дата: 23.09.2005 18:43:55

Привет, Pavel!
Ты пишешь:

Pavel
PK> Да обмен местами.
PK> Не вижу как можно применить генератор в этом случае.

А накой тебе тут НОВОЕ значение?
Меняешь местами уже существующие значения.
Где проблемы?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

AndriyKo
Дата: 23.09.2005 18:54:24
Pavel Kilevatyh
Установить значение генератора в ХП я не могу.

Вообще то можешь.
problemsolver
Дата: 23.09.2005 18:55:51
Pavel Kilevatyh

Установить значение генератора в ХП я не могу


Кстати, это можно. За выходные, надеюсь придумаешь как.
Pavel Kilevatyh
Дата: 23.09.2005 19:02:38
Мимопроходящий

Привет, Pavel!
Ты пишешь:

Pavel
PK> Да обмен местами.
PK> Не вижу как можно применить генератор в этом случае.

А накой тебе тут НОВОЕ значение?
Меняешь местами уже существующие значения.
Где проблемы?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3


Давай начнем сначала.
Операция добавить Объект в маршрут в конец списка.

Как мне получить значение ROUTE_ORDERS_ORDINAL, с учетом UK2 (см выше), превышающее максимальное значение ROUTE_ORDERS_ORDINAL, выбранное из ROUTE_ORDERS по полю маршрута, гарантируя отсутствие сбоев, если более одного оператора попытаются добавить что-то в один и тот же маршрут ?