开发者社区> 问答> 正文

mysql 存储过程改写遇到的问题

落地花开啦 2016-02-13 13:58:40 1024

下面是我写的mysql存储过程,之前使用程序写速度有点慢,现在改写但遇到点问题,希望帮忙给啊,感谢指点
BEGIN
/**
进退货统计表
参数:(都是字符串)
时间 如:2013-01-01
分部 如:1,2,3,4
供应商 如:2,3'4,2
商品编码或名称 如:SF22202
*/
`DECLARE ItemNO VARCHAR(50);
DECLARE startDa VARCHAR(15);
DECLARE endDa VARCHAR(15); `
-- 不存在则创建临时表
`CREATE TEMPORARY TABLE if not exists reportAdvanceReurn
(
branchId VARCHAR(50) NOT NULL,-- 订货分部id
supplierId VARCHAR(50) NOT NULL,-- 供应商id
itemNo VARCHAR(20) NOT NULL, -- 商品编码
itemName VARCHAR(50) NULL,-- 商品名称
AdvanceAmount DECIMAL(18,4) NULL, -- 进货量
AdvancePrice DECIMAL(18,4) NULL, -- 进货单价
ReturnAmount DECIMAL(18,4) NULL, -- 退货量
ReturnPrice DECIMAL(18,4) NULL, -- 退货单价
unitName VARCHAR(10) null,-- 单位名称
total DECIMAL(18,4) null, -- 小计

`    

`UNIQUE KEY (branchId,supplierId,itemNo)
);`
-- 临时存储数量表 不存在则创建临时表
`CREATE TEMPORARY TABLE if not exists reportAdvanceReurnAmount
(
branchId VARCHAR(50) NOT NULL,-- 订货分部id
supplierId VARCHAR(50) NOT NULL,-- 供应商id
itemNo VARCHAR(20) NOT NULL, -- 商品编码
amount DECIMAL(18,4) NULL -- 量
);`

TRUNCATE TABLE reportAdvanceReurn; -- 使用前先清空临时表
-- 设置模糊查询的值
`IF(itemNo IS NOT NULL ) THEN

SET  ItemNO ='%'+p_itemNo+ '%';  

end if; `
-- 进货信息
SELECT branch.NAME` AS '订货分部',supplier.SUPPLY_NAME AS '供应商名称', item.ITEM_NO AS '商品编码',
item.ITEM_NAME AS '商品名称',bdun.NAME AS '单位',SUM(qcyitem.PRICE)/SUM(qcyitem.AMOUNT) AS '单价',SUM(qcyitem.AMOUNT) '验收量',
(SUM(qcyitem.PRICE)/SUM(qcyitem.AMOUNT))*SUM(qcyitem.AMOUNT) AS '小计'
FROM qcy_purchase_info_item AS item
LEFT JOIN qcy_purchase_info AS qinfo ON item.HEADER_ID = qinfo.ID
LEFT JOIN bd_supplier AS supplier ON supplier.ID = qinfo.SUPPLIER_ID
LEFT JOIN bd_branch AS branch ON branch.ID = item.REQUEST_BRANCH_ID
LEFT JOIN sys_user AS su ON su.ID = qinfo.MODIFIER
LEFT JOIN bd_unit AS bdun ON bdun.ID = item.UNIT
LEFT JOIN qcy_acceptence_info AS qcyinfo ON qcyinfo.SOURCES_NO=qinfo.NO
LEFT JOIN qcy_acceptence_info_item AS qcyitem ON qcyitem.HEADER_ID=qcyinfo.ID AND qcyitem.ITEM_NO=item.ITEM_NO
where item.AMOUNT>0
AND qinfo.PURCHASE_DATE >= startDate AND qinfo.PURCHASE_DATE <= endDate
AND qcyinfo.REQUEST_BRANCH_ID IN (branchIdList) AND qcyinfo.SUPPLY_UNITS_ID in(supplierList)
AND item.ITEM_NO LIKE ItemNO OR item.ITEM_NAME LIKE ItemNO
GROUP BY branch.ID,supplier.ID ,item.ITEM_NO ORDER BY branch.ID,supplier.ID,item.ITEM_NO;
TRUNCATE TABLE reportAdvanceReurnAmount; -- 使用前先清空临时表
END`
其中下面这部分是根据参数是否存在才加的限制条件,这里如果不传参数是不是会有问题啊??如果有问题应该如何做啊?
知道的希望指点一下啊
where item.AMOUNT>0
AND qinfo.PURCHASE_DATE >= startDate AND qinfo.PURCHASE_DATE <= endDate
AND qcyinfo.REQUEST_BRANCH_ID IN (branchIdList) AND qcyinfo.SUPPLY_UNITS_ID in(supplierList)
AND item.ITEM_NO LIKE ItemNO OR item.ITEM_NAME LIKE ItemNO

分享到
取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 18:41:58

    跟你执行sql语句一样,这地方不传递参数肯定会有问题,除非你指定默认值,解决方法就是各个参数判断下是否为空,然后根据判断结果决定是否append到sql语句中。
    用工具单独运行没问题的话说明存储过程没问题,问题出在你的代码上,确认下是否所有的in参数都有值。

    0 0
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题
推荐课程