MySQL триггер не работает, когда я вставляю запись из кода Java - PullRequest
0 голосов
/ 16 апреля 2011
DELIMITER //

DROP TRIGGER insert_orderinward_trig; //

CREATE TRIGGER insert_orderinward_trig AFTER INSERT ON tblm_tlmngorderinward FOR EACH ROW
BEGIN

    call temp_proc(NEW.itemcode);

END; //

Я пишу процедуру как

DELIMITER //

DROP PROCEDURE temp_proc; //

CREATE PROCEDURE temp_proc(IN code VARCHAR(80))

BEGIN
    DECLARE inwardstock,issuestock,updatestock DECIMAL(15,0) DEFAULT 0;

    SET inwardstock = (SELECT SUM(stock) FROM tblm_tlmngorderinward WHERE itemcode = code);
    IF(@inwardstock > 0) THEN
        SET updatestock =inwardstock;   
    END IF;


    SET issuestock = (SELECT SUM(stock) FROM tblt_tlmngissueitem WHERE itemcode = code);

    IF(@issuestock > 0) THEN
        SET updatestock = @updatestock-@issuestock ;    
    END IF;

    UPDATE tblm_tlmngitem SET stock=updatestock  WHERE itemcode=code;

END; //

DELIMITER ;

Мой триггер вставки работает нормально, когда я вставляю запись вручную. Но это не может работать, когда я вставляю запись с использованием preparestatement в Java.

1 Ответ

0 голосов
/ 16 апреля 2011

На первый взгляд, у вас есть 2 переменные для inwardstock / @ inwardstock и IsstockStock / @ IsstockStock, которые выглядят неверно:

DECLARE inwardstock,issuestock,updatestock DECIMAL(15,0) DEFAULT 0;

IF(@inwardstock > 0) THEN <--- @inwardstock or inwardstock !!

...

IF(@issuestock > 0) THEN <--- @issuestock or issuestock !!

Другое предложение, которое у меня есть, - полностью сбросить триггер и просто вызвать сохраненный процесс:

delimiter #

create procedure insert_tblm_tlmngorderinward
(
in p_itemcode varchar(80) -- p_ is for param
)
begin

-- v_ is for variable 

declare v_inwardstock, v_issuestock, v_updatestock decimal(15,0) default 0;

    -- do this in stored proc

    insert into tblm_tlmngorderinward (itemcode) values (p_itemcode);

    -- now do all the trigger stuff

    select sum(stock) into v_inwardstock from tblm_tlmngorderinward where itemcode = p_itemcode;
    select sum(stock) into v_issuestock from tblt_tlmngissueitem where itemcode = p_itemcode;

    if(v_inwardstock > 0) then
        set v_updatestock = v_inwardstock;      
    end if;

    if(v_issuestock > 0) then
        set v_updatestock = v_updatestock - v_issuestock;       
    end if;

    update tblm_tlmngitem set stock = v_updatestock where itemcode = p_itemcode;

end#

delimiter ;

call insert_tblm_tlmngorderinward('why_use_a_trigger');

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...