Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Gage
- Сообщения: 18
- Зарегистрирован: 26 ноя 2005, 20:17
Сообщение
Gage » 26 ноя 2005, 21:59
Проблема - динамически установить одним запросом значение генератора.
не подходит, так как значение 3650 определяется динамически.
Хотелось бы что-то вроде такого
Код: Выделить всё
update rdb$generators
set rdb$generator_value = (select max(ID) from Table1)
where rdb$generator_name = 'GENABC'
Только вот поля rdb$generator_value там нет.
Где же храниться значение генератора?
(FB 1.5)
-
Gage
- Сообщения: 18
- Зарегистрирован: 26 ноя 2005, 20:17
Сообщение
Gage » 26 ноя 2005, 22:41
Прочитал вдумчиво еще раз.
Мало что дало.
Так все-таки можно или нет сделать одним запросом?
-
dimitr
- Разработчик Firebird
- Сообщения: 888
- Зарегистрирован: 26 окт 2004, 16:20
Сообщение
dimitr » 27 ноя 2005, 09:08
Gage писал(а):Где же храниться значение генератора?
Там, куда ты не залезешь.
Gage писал(а):Так все-таки можно или нет сделать одним запросом?
Можно. Читай еще более вдумчиво.
-
Gage
- Сообщения: 18
- Зарегистрирован: 26 ноя 2005, 20:17
Сообщение
Gage » 27 ноя 2005, 12:59
Код: Выделить всё
select gen_id(genMy, (select max(id) from table) - gen_id(genMy,0))
from rdb$database
Так?

-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 27 ноя 2005, 17:34
ЕЩЕ раз прочитай про генераторы. Чего то люди совсем читать разучились. Я уж и статью целиком переписал, а все равно...
-
Gage
- Сообщения: 18
- Зарегистрирован: 26 ноя 2005, 20:17
Сообщение
Gage » 27 ноя 2005, 19:19
В третий раз закинул старик невод.
И в третий раз не вытащил ничего нового.
Чем посылать меня к руководству, может скажешь, что ты имеешь ввиду?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 28 ноя 2005, 10:14
зачем тебе select ? Ты чего хочешь сделать, лучше объясни. Начать отсчет генератора от максимального значения в таблице? Это на случай сбоев, или еще чего?
-
Ivan_Pisarevsky
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Сообщение
Ivan_Pisarevsky » 28 ноя 2005, 11:08
Наверно, беспокойство, что значений генератора не хватит

...
Переход на 64 битное значение, думаю, 100% решит проблему нехватки номеров.
Ну можно, конечно, отсчитать значение генератора от максимума, только одна оговорка: это можно делать только в однопользовательском режиме.
-
Gage
- Сообщения: 18
- Зарегистрирован: 26 ноя 2005, 20:17
Сообщение
Gage » 28 ноя 2005, 12:09
Да, видно сразу надо было по подроднее. Sorry.
Дого объяснять - задача, конечно, кривая.
Смысл вот в чем - надо в одном запросе установить и получить значение генератора в число, которое возвращает подзапрос.
Тот запрос, что я написал несколькими постами выше - работает.
Если есть решение "правильнее" - посоветуйте.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 28 ноя 2005, 12:30
раз работает - используй. вопрос к тебе был - зачем ты так делаешь. В том смысле, не напорешься ли на конкурентное выполнение двух-трех таких запросов одновременно.
-
Gage
- Сообщения: 18
- Зарегистрирован: 26 ноя 2005, 20:17
Сообщение
Gage » 28 ноя 2005, 12:47
Да. Это понятно. Само-собой, учтено.
Кстати, если есть возможность поправить - там в FAQе
Код: Выделить всё
TEMPVAR = GEN_ID(NEWCLIENT, -GEN_ID(NEWCLIENT, 0);
скобки сзади не хватает.
-
Ivan_Pisarevsky
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Сообщение
Ivan_Pisarevsky » 28 ноя 2005, 16:50
Селективная процедура+наращиваение локальной переменной будет нечувствительно к многопользовательскому режиму, в отличие от наращивания генератора.
Опять же почему не выполнить селект каунт(*) с тем же where что и подзапрос и получить количество без всяких генераторов.
Вобщем мне постановка не понятна...