Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Изменение генератора FireBird из процедуры

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

retroguy

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго всем времени суток!
 
Есть процедура
create or alter procedure UPDATE_TRIGGERS
as
declare variable NEW_VAL integer;
declare variable T_NAME varchar(30);
declare variable G_NAME varchar(30);
begin
  for select b.table_name, b.generator_name from backup_data b into :t_name, :g_name do
  begin
    select max(t.id)+1 from :t_name t into :new_val;
    alter sequence :g_name restart with :new_val;
  end
end
 
При компиляции выдает  
Parsing error!!!
Как всегда многозначительно... В чем беда не могу взять в толк.
 
Смысл в том, что есть таблица backup_data, в которой хранятся названия таблиц table_name и нужные имена генераторов generator_name. Необходимо циклом обойти все записи (table_name) из таблицы backup_data и по именам генераторов (generator_name) исправить их значения на  max(t.id)+1.
 
В интернете толком ничего не нашел по данной теме.
 
Процедура нужна дабы исправлять/обновлять значения генераторов которые иногда вылетают.
 
P.S. Используемая FireBird 2.5.1 x32

Всего записей: 3 | Зарегистр. 23-09-2013 | Отправлено: 13:54 14-02-2014 | Исправлено: retroguy, 13:57 14-02-2014
Coltrain

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
retroguy
Имя таблицы не может быть параметром. В твоем случае надо использовать конструкцию с EXECUTE STATEMENT.
 
 
Добавлено:
Но похоже, лечишь следствие, а не причину. Что значит "значения генераторов вылетают"?

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 14:27 14-02-2014
retroguy

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я не совсем верно выразился, признаюсь.
 
Значит ситуация такова, что иногда по каким-то причинам после определенных крупных операций по импорту/экспорту (не через утилиту imp/exp), значения генераторов не являются актуальными. Нужно просто привести значения к их актуальным значениям одной процедурой а не вручную, потому как таблиц около 200 ).
 
С EXECUTE STATEMENT не доводилось работать. Если можно небольшой примерчик. Заранее благодарен.

Всего записей: 3 | Зарегистр. 23-09-2013 | Отправлено: 15:49 14-02-2014
Coltrain

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
retroguy
Да без проблем . Ничего "военного" там нет, а штука полезная.
 
Для твоего случая надо объявить переменную строкового типа чтоб записывать в нее выражение SQL. Хоть бы и так:

Код:
declare variable S varchar(255);

И тело цикла по строкам таблички "backup_data" будет выглядеть так:

Код:
 
--    select max(t.id)+1 from :t_name t into :new_val;
    S = 'select max(t.id)+1 from '||:t_name||' t';
    EXECUTE STATEMENT S INTO :new_val;
--    alter sequence :g_name restart with :new_val;
    S = 'alter sequence '||:g_name||' restart with '||:new_val;
    EXECUTE STATEMENT S;
 

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 16:20 14-02-2014
retroguy

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спсасибо большое, Coltrain! Очень помог!
В итоге имеем следующее. Код немного упрощен, но рабочий.
 
create or alter procedure UPDATE_TRIGGERS
as
declare variable NEW_VAL integer;
declare variable T_NAME varchar(30);
declare variable G_NAME varchar(30);
begin
  for select b.table_name, b.generator_name from backup_data b into :t_name, :g_name do
  begin
    EXECUTE STATEMENT 'select max(id)+1 from '|| :t_name into :new_val;
    EXECUTE STATEMENT 'alter sequence '|| :g_name ||' restart with '|| :new_val;
  end
end
 
P.S. Все как обычно оказалось немного проще, чем казалось )
P.P.S. Можно конечно переписать на универсальную процедуру перебора выборкой всех таблиц из БД и соотвествующих им генераторов. Но это чуть позже...

Всего записей: 3 | Зарегистр. 23-09-2013 | Отправлено: 12:33 15-02-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
retroguy

Цитата:
Можно конечно переписать на универсальную процедуру перебора выборкой всех таблиц из БД и соотвествующих им генераторов.  

Прямо из базы их не возмешь. Требуется парсинг конструкций типа. Успешно решал такую задачу года 3 назад.
//  1. NEW.CNT = GEN_ID(S_EMPLOYEE, 1)
//  2. NEW.CNT = NEXT VALUE FOR S_EMPLOYEE

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 03:04 18-02-2014 | Исправлено: YuriyRR, 03:08 18-02-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Изменение генератора FireBird из процедуры


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru