下面是我写的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
跟你执行sql语句一样,这地方不传递参数肯定会有问题,除非你指定默认值,解决方法就是各个参数判断下是否为空,然后根据判断结果决定是否append到sql语句中。
用工具单独运行没问题的话说明存储过程没问题,问题出在你的代码上,确认下是否所有的in参数都有值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。