udělal jsem to jako proceduru
drop procedure if exists ZaokrouhliCas;
delimiter //
create procedure ZaokrouhliCas(inout ncas datetime(3), inout nhodnota double)
begin
insert temp (cas, hodnota) values (ncas, nhodnota); /*vlozi nejnovejsi hodnotu do docasne tabulky*/
delete from temp where cas < (ncas - interval 20 second); /*odstrani starsi hodnoty, historie 6 sec postacuje*/
select (max(zaokrouhleno) - interval 3 second) into ncas from temp; /*ncas = cas ke kteremu se hleda nejblizsi*/
select min(abs(timediff(ncas, cas))) into @d from temp; /*@d = nejmensi diference od pozadovaneho casu*/
select hodnota into nhodnota from temp where abs(timediff(ncas, cas)) = @d limit 1;
end;
//
delimiter ;
jejímu prvnímu volání předchází
create temporary table if not exists temp (cas datetime(3), hodnota float, zaokrouhleno datetime as (cas));
a samotná práce pak
START TRANSACTION; set @v = ?napeti; set @c = ?cas; call ZaokrouhliCas(@c, @v); insert leva_teploty (cas, teplota) values (@c, TcVoltToTherm(?TcType, @v)) on duplicate key update teplota = teplota; COMMIT;
kde jména začínající otazníkem jsou parametry. Aplikace používá .NET Conector. Když data vkládá aplikace nepravidelně dojde k vynechání záznamu v tabulce leva_teploty. Čas a hodnota aplikace ukládá ještě do jiné tabulky (pomocný log pro hledání příčiny), kde k žádnému vynechání záznamu nedochází. V aplikaci nedojde k vyjímce. Pokud vezmu časový úsek asi 10 sec okolo vynechaného záznamu a provedu skript pro každý záznam z logu ručně, k vynechání záznamu taky nedojde. Zpočátku jsem to neprováděl jako transakci, chování bylo stejné. Jak odhalit příčinu tohoto chování?
hu