powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По поводу использования в процедурах конструкции set generator to ...
11 сообщений из 11, страница 1 из 1
По поводу использования в процедурах конструкции set generator to ...
    #32620826
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу использования в процедурах конструкции set generator to ...

FireBird 1.5.1

Пытаюсь создать процедуру по "аварийному" восстановлению значений генераторов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE PROCEDURE RESET_GENERATORS
AS
DECLARE VARIABLE NEW_ID BIGINT;
begin
 --------------------------------------------------------------------
 
 -- Сброс генераторов - начало блока
 

select Coalesce(Max(Bank_id),  0 ) from Bank into :New_id;  -- Банки
 
set generator Bank_id_gen to New_id;

select Coalesce(Max(Bill_id),  0 ) from Bill into :New_id;  -- Счет
 
set generator Bill_id_gen to New_id;

 --...
 
 --...
 
 --...
 

select Coalesce(Max(Unit_id),  0 ) from Unit into :New_id;  -- Ед.измерения
 
set generator Unit_id_gen to New_id;

 -- Сброс генераторов - конец блока
 
 --------------------------------------------------------------------
 
end
- так не компилируется. "Set", говорит, недопустимая конструкция. Далаю так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE PROCEDURE RESET_GENERATORS2
AS
DECLARE VARIABLE NEW_ID BIGINT;
DECLARE VARIABLE EXEC VARCHAR( 128 );
begin
 --------------------------------------------------------------------
 
 -- Сброс генераторов - начало блока
 

select Coalesce(Max(Bank_id),  0 ) from Bank into :New_id;  -- Банки
 
EXEC = 'set generator Bank_id_gen to ' || New_id;
EXECUTE STATEMENT EXEC;

select Coalesce(Max(Bill_id),  0 ) from Bill into :New_id;  -- Счет
 
EXEC = 'set generator Bill_id_gen to ' || New_id;
EXECUTE STATEMENT EXEC;

 --...
 
 --...
 
 --...
 

select Coalesce(Max(Unit_id),  0 ) from Unit into :New_id;  -- Ед.измерения
 
EXEC = 'set generator Unit_id_gen to ' || New_id;
EXECUTE STATEMENT EXEC;

 -- Сброс генераторов - конец блока
 
 --------------------------------------------------------------------
 

end
- так получается. Ну и так, естественно, тоже:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE PROCEDURE RESET_GENERATORS
AS
DECLARE VARIABLE NEW_ID BIGINT;
begin
 --------------------------------------------------------------------
 
 -- Сброс генераторов - начало блока
 

select Coalesce(Max(Bank_id),  0 ) from Bank into :New_id;  -- Банки
 
  New_id = gen_id(Bank_id_gen, New_id - gen_id(Bank_id_gen,  0 ));

select Coalesce(Max(Bill_id),  0 ) from Bill into :New_id;  -- Счет
 
  New_id = gen_id(Bill_id_gen, New_id - gen_id(Bill_id_gen,  0 ));

 --...
 
 --...
 
 --...
 

select Coalesce(Max(Unit_id),  0 ) from Unit into :New_id;  -- Ед.измерения
 
  New_id = gen_id(Unit_id_gen, New_id - gen_id(Unit_id_gen,  0 ));

 -- Сброс генераторов - конец блока
 
 --------------------------------------------------------------------
 

end
- Ну, по последнему случаю - все понятно. Всегда раньше все так делали. Но ведь
это уже 1.5.1! Должна работать фича Set generator to ...

Что скажите, отцы? Это баг или фича? Или, как всегда, виновата моя дурная головушка?
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620889
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто сказал что set generator должен работать в процедурах?
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620899
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. документация прямо утверждает возможность
применения SET GENERATOR в процедурах, то либо ошибка в доках, либо фича типа бага, имхо.
:)
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620905
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, причем напрямую - нельзя, а через Execute Statement - пожалуйста.
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620906
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая документация? в release notes нет ни слова про это...
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620916
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Базовая документация от производителя. Напр. по IB6
You can use SET GENERATOR to set or change the value of an existing generator when
writing
triggers, procedures , or SQL statements that call GEN_ID().
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620920
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борланд шутит
вот ихняя статейка еще есть, там говорится обратное
http://bdn.borland.com/article/0,1410,25166,00.html
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32620974
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. А кто шутит с выполнением через

Код: plaintext
1.
EXEC = 'set generator Bank_id_gen to ' || New_id;
EXECUTE STATEMENT EXEC;

Так - то работает...

Или в следующем релизе подчистят, и работать не станет? Или, наоборот, "напрямую", без EXECUTE станет?
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32621038
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извращение :)
Код: plaintext
1.
select gen_id(table_id,gen_id(table_id, 0 )-(select max(id) from table)) 
from rdb$database
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32621055
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, да, а для процедуры еще добавить
Код: plaintext
1.
select gen_id(table_id,gen_id(table_id, 0 )-(select max(id) from table)) 
from rdb$database into :DummyValue
...
Рейтинг: 0 / 0
По поводу использования в процедурах конструкции set generator to ...
    #32621293
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mvНу да. А кто шутит с выполнением через

Код: plaintext
1.
EXEC = 'set generator Bank_id_gen to ' || New_id;
EXECUTE STATEMENT EXEC;

Так - то работает...

Или в следующем релизе подчистят, и работать не станет? Или, наоборот, "напрямую", без EXECUTE станет?

А кто тебе сказал, что это не должно работать? В релизных нотах абсолютно ясно сказано, что операторы DDL разрешены в EXECUTE STATEMENT, хоть и работают с оговорками. Насколько корректно считать SET GENERATOR оператором DDL - это уже другой вопрос.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По поводу использования в процедурах конструкции set generator to ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]