Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По поводу использования в процедурах конструкции set generator to ... / 11 сообщений из 11, страница 1 из 1
26.07.2004, 11:21:18
    #32620826
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
По поводу использования в процедурах конструкции 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
26.07.2004, 11:54:18
    #32620889
srf2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
кто сказал что set generator должен работать в процедурах?
...
Рейтинг: 0 / 0
26.07.2004, 11:57:23
    #32620899
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
Т.к. документация прямо утверждает возможность
применения SET GENERATOR в процедурах, то либо ошибка в доках, либо фича типа бага, имхо.
:)
...
Рейтинг: 0 / 0
26.07.2004, 12:02:31
    #32620905
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
Да, причем напрямую - нельзя, а через Execute Statement - пожалуйста.
...
Рейтинг: 0 / 0
26.07.2004, 12:02:48
    #32620906
srf2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
какая документация? в release notes нет ни слова про это...
...
Рейтинг: 0 / 0
26.07.2004, 12:08:44
    #32620916
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
Базовая документация от производителя. Напр. по 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
26.07.2004, 12:11:49
    #32620920
srf2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
Борланд шутит
вот ихняя статейка еще есть, там говорится обратное
http://bdn.borland.com/article/0,1410,25166,00.html
...
Рейтинг: 0 / 0
26.07.2004, 12:35:32
    #32620974
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу использования в процедурах конструкции set generator to ...
Ну да. А кто шутит с выполнением через

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

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

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

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

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

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

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


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