1 CREATE PROCEDURE AddCheckOut ( 2 _proId INT, 3 -- 商品主键 4 _oprerator VARCHAR (50), 5 -- 操作人 6 _checkOutNum INT, 7 -- 出库数量 8 OUT result INT -- 返回的存储过程是否执行成功的标志位 9 ) 10 BEGIN 11 -- 接收错误信息的标识变量 12 DECLARE err_flag INT DEFAULT 0; 13 14 DECLARE snum INT DEFAULT 0; 15 16 -- 处理可能会发生的错误 17 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err_flag = 1; 18 19 -- 开启事务 20 START TRANSACTION; 21 22 -- 拿到库存的值 23 SET snum = (SELECT StoreNumber FROM tb_product WHERE PId = _proId); 24 25 -- 如果库存量小于了出库量 26 IF snum < _checkOutNum THEN 27 SET result = 2;-- 说明库存不足 28 ROLLBACK;-- 回滚 29 ELSE 30 -- 更新库存量 31 UPDATE tb_product SET StoreNumber = StoreNumber - _checkOutNum WHERE PId = _proId; 32 -- 生成出库单 33 INSERT INTO TB_CheckOutBill (ProId,Oprerator,CheckOutNum) VALUES(_proId,_oprerator,_checkOutNum); 34 -- 判断是否发生了错误 35 IF err_flag = 1 THEN 36 SET result = 0; -- 说明执行失败 37 ROLLBACK; -- 回滚 38 ELSE 39 SET result = 1; -- 说明执行成功 40 COMMIT; -- 提交 41 END IF; 42 END IF; 43 END; 44 -- 出库存储过程的调用测试 45 CALL AddCheckOut (4, '张三', 120 ,@num); 46 47 SELECT @num; 48 49 -- 分页存储过程 50 CREATE PROCEDURE ProductPage ( 51 _sqlWhere VARCHAR (4000), 52 _pageIndex INT, 53 _pageSize INT, 54 OUT rowCount INT 55 ) 56 BEGIN 57 DECLARE startRow INT DEFAULT 0; -- 定义一个接收计算要跳过的数据量的变量 58 SET startRow = (_pageIndex - 1) * _pageSize; 59 60 -- 分页的sql语句 61 SET @sqlStr = CONCAT("SELECT SQL_CALC_FOUND_ROWS * from tb_product p join tb_store s on p.StoreId=s.SId ",_sqlWhere," LIMIT ",startRow,",",_pageSize); 62 63 PREPARE sqlQUery FROM @sqlStr; 64 65 EXECUTE sqlQUery; 66 67 DEALLOCATE PREPARE sqlQUery;-- 销毁预处理变量 清理内存 68 -- 取得总数据量 69 SET rowCount = FOUND_ROWS(); 70 END; 71 72 -- 分页存储过程的调用测试 73 CALL ProductPage ('', 1, 2 ,@num); 74 75 SELECT @num;