1、所谓存储过程,实际上就是mysql批处理。过程是PROCEDURE的意思,Fortun语言的函数就是过程这个关键字。 2、存储过程中用到的变量,不能跟数据库字段名重复。比如 UPDATE sku SET sku_name = sku_name WHERE sku_id = sku_id; 3、存储过程要放在某一个数据库中,但执行call存储过程时,不受数据库的影响。比如: call oms.sql_proc_calc_warehouse_fee();// 4、循环控制要注意退出判断,不要最后一句多执行一次。 WHILE ex = 0 DO FETCH cur_owner INTO m_owner; IF ex = 0 THEN call oms.sql_proc_total_volumes(m_owner, m_wid, m_volumes); IF m_volumes > 0 THEN //如果不在这里加判断的话,同样的记录会执行两次! SET m_fee = m_price * m_volumes; INSERT INTO bill_detail(created_at,is_deleted,user_id,warehouse_id,warehouse_name,money_type,money,year,month) VALUES(m_dt,0,m_owner,m_wid,m_wn,0,m_fee,yy,mm); END IF; END IF; END WHILE; 为什么会执行两次呢?DECLARE CONTINUE HANDLER FOR NOT FOUND SET ex = 1; 这句话的意思是,FETCH取不到数据的时候,将ex设置为1,从而退出while循环。对ex=0的判断在最前面,所以,就要执行两次。
DELIMITER // CREATE PROCEDURE oms.sql_proc_test_time(IN skuid VARCHAR(20)) COMMENT 'procedure to create datetime' BEGIN DECLARE yy,mm VARCHAR(20); DECLARE m_dt DATETIME; SET yy = year(curdate()); SET mm = month(curdate()); SET m_dt = now(); UPDATE sku SET brand = yy WHERE id = skuid; UPDATE sku SET brand_name = mm WHERE id = skuid; UPDATE sku SET created_at = m_dt WHERE id = skuid; SELECT brand, brand_name FROM sku WHERE id = skuid; END //