当我从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');