2011-04-16 65 views
0
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; // 

我写的程序,mysql的触发不行

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 = @[email protected] ;  
    END IF; 

    UPDATE tblm_tlmngitem SET stock=updatestock WHERE itemcode=code; 

END; // 

DELIMITER ; 

我INSERT触发器做工精细,当我手动插入记录。但是当我在java中使用preparestatement插入记录时它无法工作。

回答

0

乍一看,你似乎有2个变量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 !! 

其他建议,我已经是彻底删除触发器,只是调用存储PROC:

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

希望这有助于:)

+0

是你我可以到完成只用procedure.But我在tblm_tlmngorderinward表中的许多领域我的工作,所以是feasi可以通过所有的域作为程序参数吗? – chetan 2011-04-16 10:22:26

+0

是的 - 这很好 – 2011-04-16 12:38:03

+0

感谢您的回答 – chetan 2011-04-18 06:34:58