当我从java代码中插入记录时,mysql触发器不起作用

当我从java代码中插入记录时,mysql触发器不起作用,java,mysql,stored-procedures,triggers,Java,Mysql,Stored Procedures,Triggers,我把这个过程写成 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; // 手动插入记录时,插入触发器工作正常。但是,当我使用java中的preparestatem

我把这个过程写成

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; //

手动插入记录时,插入触发器工作正常。但是,当我使用java中的preparestatement插入记录时,它无法工作。

乍一看,您似乎有两个变量用于inwardstock/@inwardstock和issuestock/@issuestock,这两个变量看起来是错误的:

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 ;

希望这有帮助:)

是的,你是对的。我可以只使用过程来完成我的工作。但是我在tblm_tlmngorderinward表中有很多字段,所以可以将所有字段作为过程参数传递吗?
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');