Работа с генераторами и их инициализация

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

Ответить
_shuro4ka_
Сообщения: 2
Зарегистрирован: 16 окт 2007, 16:46

Работа с генераторами и их инициализация

Сообщение _shuro4ka_ » 16 окт 2007, 17:03

Народ, нужна помощь! Что не так в работе с генераторами в Firebird. Проблема вот в чем: есть процедура, которая должна установить одинаковое начальное значение всем генераторам БД, имена этих генераторов выбираем из системной таблицы, а потом просим исполнить стейтмент. Все нормально, ошибок нет. Но только вот незадача - значения генераторов не изменяются, если просто запустить процедуру и прокоммитить. А если сделать тоже в дебаге - все нормально и все меняется... мистика
вот скриптика кусочек:
for select rdb$generators.rdb$generator_name from rdb$generators where rdb$generators.rdb$system_flag is null
into :sval
do
begin

s='SET GENERATOR ' || sval || ' TO 900000';
execute statement s;

end
end

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

Сообщение WildSery » 16 окт 2007, 17:19

Учи SQL. Нет такой команды "SET GENERATOR".

_shuro4ka_
Сообщения: 2
Зарегистрирован: 16 окт 2007, 16:46

Сообщение _shuro4ka_ » 17 окт 2007, 15:52

WildSery писал(а):Учи SQL. Нет такой команды "SET GENERATOR".
Может автор имел ввиду что-то из этой оперы:

"...Значение генератора можно переустановить при помощи оператора DDL
SET GENERATOR generatorname TO value;
Однако вы не сможете использовать такое выражение в теле триггера или хранимой процедуры, т.к. там можно использовать только операторы DML (а не DDL)....(http://www.sql.ru/docs/interbase/generator.shtml) )

но все теперь у меня работает через команду execute в хранимой процедуре ;) а проблема была в том, что со строками внимательнее работать надо и их преобразованием(в том числе и скрытым). А вот и кусочек:

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

CREATE PROCEDURE SET_GEN_START (
    IVAL INTEGER)
AS
DECLARE VARIABLE SVAL CHAR(31) CHARACTER SET UNICODE_FSS;
DECLARE VARIABLE IVAL_I VARCHAR(20);[/b]
DECLARE VARIABLE S VARCHAR(200);
DECLARE VARIABLE SS VARCHAR(80);
begin

    for select rdb$generators.rdb$generator_name from rdb$generators where rdb$generators.rdb$system_flag is null
    into :sval
    do begin
            ss='';
            s='';

            ss=cast(sval as varchar(100));
            ival_i=cast(ival as varchar(20));
            s='SET GENERATOR ' || ss || ' TO ' || ival_i ;

            execute statement s;

   end
end
[шурочка, пользуйтесь тэгом code. кроме того, помните, что
execute statement в руках начинающего опаснее водородной бомбы
]

проверено - все работает :))

Ответить