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;