【问题标题】:mysql trigger not work when i insert record from java code当我从java代码插入记录时,mysql触发器不起作用
【发布时间】:2011-04-16 09:38:47
【问题描述】:
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 ;

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

【问题讨论】:

    标签: java mysql stored-procedures triggers


    【解决方案1】:

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

    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');
    

    希望这会有所帮助:)

    【讨论】:

    • 是的,你是对的。我可以只使用过程来完成我的工作。但是我在 tblm_tlmngorderinward 表中有很多字段,所以将所有这些字段作为过程参数传递是否可行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2014-02-20
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多