Изменение значения генератора.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Изменение значения генератора.

Сообщение john_chek » 16 фев 2007, 09:47

Здравствуйте! Подскажите пожалуйста как в Firebird 2.0 с помощью тригера изменить значение генератора? Что то типа:

Код: Выделить всё

AS
begin
    generator gen_sapout_id value : '0';
end
В общем это не правильно, а как правильно? Нужно чтобы после удаления записи значение всегда обнулялось!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 фев 2007, 09:48


john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 10:08

Вот в процедуре написал:

Код: Выделить всё

begin
    TEMPVAR = GEN_ID(gen_sapout_id, -GEN_ID(gen_sapout_id, 0));
    suspend;
end
TEMPVAR - это output parameters!
так ка же теперь в тригере к ней обратится? Пишу тригер:

Код: Выделить всё

AS
begin
    execute procedure  pr_gen_nul;
end
А мне ошибка:
Output parameter mismatch for procedure PR_GEN_NUL.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 фев 2007, 10:31

ды думать можешь? или ты только можешь копировать примеры один к одному?
зачем тебе тут вообще процедура?

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 10:34

че ты грубишь то? ну не знаю я что теперь! А подсказать конкретно что не можешь? Тем более там как раз написано, что обнулять лучше через процедуру!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 фев 2007, 10:38

А подсказать конкретно что не можешь?
ну потому что это вообще из ряда вон.

1. объяви переменную в триггере
2. присвой ей GEN_ID(NEWCLIENT, -GEN_ID(NEWCLIENT, 0));

Охрененно сложно, да? Вместо этого надо процедуру писать БЕЗ переменной или возвращаемого результата, этой переменной надо присваивать выражение, писать suspend, вызывать процедуру в триггере, так? То есть, ты никогда не писал ни триггеров ни процедур раньше, и не читал по этому поводу ни книжек ни документации?
Тем более там как раз написано, что обнулять лучше через процедуру!
там написано что в процедуре МОЖНО так написать. Но у IB/FB это язык процедур и триггеров. Да, я допишу, конечно, что можно так делать и в процедуре и в триггере.
Но в триггерах обычно никто генераторы не обнуляет. Потому что это по большому счету бредовая идея.

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 10:57

Скажу честно, я новичек в базах! Я больше по клиентским частям, а тут так получилось что нужно!

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 16 фев 2007, 11:09

Вот этот человек наверняка может тратить 2 часа в день на дорогу до работы за $1500 в месяц. А толку?..
Дим, ты веришь что "по клиентским частям" он бОльший специалист? Я, почему-то - нет. :cry:

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 фев 2007, 11:42

john_chek писал(а):а тут так получилось что нужно!
Не верю (с)

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 12:11

бОльший специалист?:
А я и не говорил что большой специалист! Просто к базам имею меньшее отношение! Ну пря заклевали, не хорошо то как!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 фев 2007, 12:33

john_chek писал(а):Ну пря заклевали, не хорошо то как!
Никто тебя не клевал.
А чтобы не читать саркастические ответы, надо всего лишь обосновать необходимость в сбросе генератора в триггере. Потому как в нашей многолетней практике такой ситуации почему-то не возникало.

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 13:01

Хорошо обосную. У меня таблица, которая хранит в себе массив чисел. После каждой записи в таблицу этот массив выводится в отчет (Report) на печать, после чего актуальность этих чисел пропадает! Перед каждой вставкой в таблицу, нового массива, все значания из неё удаляются, ну а генератор соответсвенно не обнуляется! Ну вот впринципе и подумал хорошо бы каждый раз начинать с нуля! Иначе через месяц работы значение генератора будет с пятью нулями!

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 16 фев 2007, 14:14

То ли пятница, то ли весеннее обострение на две недели раньше срока...

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 14:20

Ладно, все равно спс! Сделал я уже триггером. 8)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 фев 2007, 15:08

john_chek писал(а):Иначе через месяц работы значение генератора будет с пятью нулями!
Ну и что?
Если у тебя всего-навсего несколько сот тысяч в месяц записей, то значений генератора хватит не менее чем на 100 лет.
Каждый раз проверяя значение генератора в триггере, ты замедлишь вставку записей на пару милисекунд, никакого другого эффекта не видать.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 фев 2007, 15:20

не совсем понимаю, как ты там устроил, в каком именно триггере сбрасывается генератор. я понимаю, если его в приложении сбрасывать. А так триггер же срабатывает на каждую запись. Или у тебя отдельная таблица, в которой ты "сигналишь" о приеме нового массива данных?

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 15:48

Ну и что?
Если у тебя всего-навсего несколько сот тысяч в месяц записей, то значений генератора хватит не менее чем на 100 лет.
Каждый раз проверяя значение генератора в триггере, ты замедлишь вставку записей на пару милисекунд, никакого другого эффекта не видать.
Я вроде писал, что эта таблица используется для массива чисел, эти числа выводятся на печать! Если их потом не удалять то отчет с каждым разом будет расти и расти и тд и тп...Поэтому эти сотни записей мне не к чему!
не совсем понимаю, как ты там устроил
на клиентской части перед записью массива, выполняю запрос на удаление всех записей в таблице.
тригер генератора стоит перед вставкой, а после удаления:
AS
declare variable I int;
begin
I = GEN_ID(gen_sapout_id, -GEN_ID(gen_sapout_id, 0));
end
отнимает у значения генератора его значение, О чем впринципе я вас просил помочь.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 фев 2007, 15:49

то есть, триггер будет срабатывать при вставке КАЖДОЙ записи? Поздравляю! :D

кстати, как я понял, вставка записей однопользовательская?

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 15:52

Короче говоря таблица находится постоянно с одним и темже набором ID, меняются только даннае (числа) в ней.

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 16 фев 2007, 15:54

kdv писал(а):то есть, триггер будет срабатывать при вставке КАЖДОЙ записи? Поздравляю! :D


кстати, как я понял, вставка записей однопользовательская?
при вставке КАЖДОЙ записи?
не при вставке, а при удалении!

Да вставка 1 польз. А вот на счет КАЖДОЙ записи, тут промах! спс, нужно переосмыслить, хотя все раюботает довольно быстро

Ответить