Вопрос связан с использованием SQLDb.
Создаю из приложения на Lazarus триггер на UPDATE записи в БД, он там что-то считает, изменяет поля и создает/иницирует пользовательские переменные в БД, которые потом будут нужны для INSERT в следующую запись.
- Код: Выделить всё
s:='CREATE TRIGGER kk_gamma.myTrigUp_7 BEFORE UPDATE ON sg_tank_7 '+
'FOR EACH ROW '+
'BEGIN '+
'DECLARE j INT ;'+
'DECLARE sh_num INT ;'+
'DECLARE m_end,meas Double ;'+
'DECLARE b_beg,b_end,book Double ;'+
'DECLARE old_n_b,n_book Double ;'+
'DECLARE koeff,cur_m,cur_d,cur_koef,old_koef Double ;'+
// расчитываем данные для новой записи
'SET sh_num = (select max(shift_num) from sg_tank_7);'+
'SET old_koef =(select koef from sg_tank_7 where shift_num=sh_num);'+
'SET m_end = (select NEW.meas_end from sg_tank_7 where shift_num=sh_num);'+
'SET b_beg = (select book_beg from sg_tank_7 where shift_num=sh_num);'+
'SET b_end = (select NEW.book_end from sg_tank_7 where shift_num=sh_num);'+
'SET old_n_b = (select book_n from sg_tank_7 where shift_num=sh_num);'+
'SET meas = (select sum(meas_beg - meas_end) from sg_tank_7 where shift_num < sh_num);'+
//важно для последней записи берем NEW !!!, так как в табл зачений еще нет!!
'SET meas = meas + (select sum(meas_beg - NEW.meas_end) from sg_tank_7 where shift_num = sh_num);'+
//важно для последней записи берем NEW !!!, так как в табл зачений еще нет!!
'SET book = (select sum(koef*(book_beg - book_end)) from sg_tank_7 where shift_num < sh_num);'+
'SET book = book + (select sum(koef*(book_beg - NEW.book_end)) from sg_tank_7 where shift_num = sh_num);'+
'SET koeff = 1.0;'+ //на всякий пож
'SET cur_m = 100000;'+
'SET j=-434;'+
'while j <= 432 do '+
'SET j:=j+1;'+
'SET cur_koef:=1+0.00001*j;'+
'SET cur_d:=book - cur_koef*meas;'+
'if abs(cur_d) <= cur_m then '+
'set cur_m=cur_d;'+
'set koeff:=cur_koef; '+
'end if;'+
' end while;'+
'SET NEW.flag=2;'+
'SET NEW.book_n=old_n_b - old_koef*(b_beg-b_end);'+
//сделаем пользовательские переменные для новой записи, которая вставится потом по процедуре
'SET @flag_7 = 7;'+
'SET @shift_num_7=sh_num+1;'+
'SET @m_beg_7=m_end;'+
'SET @b_beg_7=b_end;'+
'SET @n_book_7=old_n_b - old_koef*(b_beg-b_end);'+
'SET @n_koef_7=koeff;'+
'END';
При UPDATE из командной строки MySql все работает, а при UPDATE из софта на Lazarus выполняется все до инициализации пользовательских переменных (до SET @flag), т.е. пользовательские не создаются.
Кроме того, из Lazarus нельзя прочитать пользовательские переменные, например запрос
- Код: Выделить всё
select @flag_7
не возвращает ничего, а в консоли все Ок...
p.s. В консоли я из под root, а в приложении - user, однако в свойствах SQLConnection установлен root, ведь позволено же создавать триггер.