Константин wrote:
Вопрос: когда я, с таким подходом, напорюсь на грабли ? И на какие ?
CREATE PROCEDURE DOC_PROVODKA (
    doc_id bigint)
as
declare variable i bigint;
declare variable tid bigint;
declare variable ftid bigint;
begin
// Stop - семафор,
// sleep - UDF наподобие Application.ProcessMessages в Delphi
  while (gen_id(stop, 0) <> 0)) do sleep(100);
  i = gen_id(stop, 1);

  Здесь. Запросто можешь получить в i не 1, как ты думаешь, а 2,3...N

  select TYPE_ID, to_id from vw_doc where id = :doc_id into :tid, :ftid;

  select max(num) from doc where TYPE_ID = :tid into :i;

  Здесь. Либо лишний индекс либо будешь курить бамбук.

  update doc set num = z(:i) + 1 where id = :doc_id;

  select max(UserNUM) from doc where TYPE_ID = :tid and to_id = :ftid into :i;

  Здесь. Либо лишний индекс либо будешь курить бамбук.

  update vw_doc set UserNUM = z(:i) + 1 where id = :doc_id;

  i = gen_id(stop, -1);

  Здесь. Запросто можешь получить в i не 0, как ты думаешь, а 1,2,3...N

end

А если серьёзно, кто что думает по этому поводу ?

  Очередной лисапет с до боли знакомыми квадратными колёсами.

Если можно, подскажите варианты решения ... желательно опробованные на
практике ...

Раз уж тебе приспичило создавать бутылочные горлышки в системе и выстраивать всех в очередь, заведи табличку

Номера
Тип документа not null PK
Следующий номер int

и получай номер как-нибудь так:

Starttransaction
Repeat
 Try
   Update Номера Set Следующий номер = Следующий номер +1
   Where Тип документа = Чаво нада;
   Select Следующий номер
    From Номера
    Where Тип документа = Чаво нада;
   Получилося:=True;
   Except Do
    Получилося:=False;
 end;
Until Получилося;
Тыр-пыр-восемь дыр, ну там инсёрт или ещё чего нада для щастья
Commit;

Это для read_commited. А ващета про генерацию "людских", а не искуственных номеров, подробные статейки есть, и вроде даже у ДК на сайте...

--
Regards. Ded.

Ответить