请教一个存储过程问题

一起混吧 2017-01-16 11:05:14
CREATE DEFINER=`root`@`%` PROCEDURE `ps_test`(workInfoId INT,staffId INT,OUT errorNo INT,OUT errorInfo VARCHAR(1000))
BEGIN
DECLARE cur_step INT DEFAULT 0;
DECLARE next_staff VARCHAR(20) DEFAULT '';
SET errorNo=0;
SET errorInfo='成功';

SELECT step INTO cur_step FROM T1 WHERE work_info_id=workInfoId AND staff_id=staffId AND stat =1; -- 查找当前步骤
SELECT GROUP_CONCAT(staff_id) INTO next_staff FROM T1 WHERE work_info_id=workInfoId AND step=cur_step+1; -- 查找下一步审核人ID
DELETE FROM T2 WHERE work_id=workInfoId AND staff_id IN(next_staff); -- 删除下一步审核人的短链接

END$$

DELIMITER ;

当next_staff 为 1,2,3 时
其中的 DELETE FROM T2 WHERE work_id=workInfoId AND staff_id IN(1,2,3); 只能删除一个,要怎么写才能都删除呢
谢谢!
...全文
882 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一起混吧 2017-01-20
  • 打赏
  • 举报
回复
引用 5 楼 fcy_n 的回复:
[quote=引用 2 楼 jordan102 的回复:] [quote=引用 1 楼 zjcxc 的回复:] 在 staff_id IN(next_staff); 中, next_staff 是一个值,不是一个值列表,删除一个是对的 删除多个的话,用 find_in_set(staff_id, next_staff)
谢谢,next_staff 是一个值列表,代码中用GROUP_CONCAT函数组织的,改成find_in_set 确实可以,但是用in就只能删除一个。奇了怪了。[/quote] 不奇怪,过程是这样的:staff_id IN(next_staff) -> staff_id IN(‘1,2,3’) ->staff_id IN(‘1’) -> staff_id IN(1),因此只会删除1这条记录[/quote] staff_id IN(‘1,2,3’) ->staff_id IN(‘1’) -> staff_id IN(1) 这个转变是根据什么来的?根据staff_id 是int类型,所以in里面的值也会根据它前面的字段类型来转化成int类型?然后‘1,2,3’ 转变成int的话是1, 是这样理解吗?
fcy_n 2017-01-19
  • 打赏
  • 举报
回复
引用 2 楼 jordan102 的回复:
[quote=引用 1 楼 zjcxc 的回复:] 在 staff_id IN(next_staff); 中, next_staff 是一个值,不是一个值列表,删除一个是对的 删除多个的话,用 find_in_set(staff_id, next_staff)
谢谢,next_staff 是一个值列表,代码中用GROUP_CONCAT函数组织的,改成find_in_set 确实可以,但是用in就只能删除一个。奇了怪了。[/quote] 不奇怪,过程是这样的:staff_id IN(next_staff) -> staff_id IN(‘1,2,3’) ->staff_id IN(‘1’) -> staff_id IN(1),因此只会删除1这条记录
zjcxc 2017-01-17
  • 打赏
  • 举报
回复
我觉得已经说得够清楚了,in的语法是: IN ( subquery | expression [ ,...n ] ) 对比语法,staff_id IN(next_staff); 这个很清楚,next_staff 就是一个 expression ,一组 expression 是 in (next_staff1, next_staff2) 换句话说,next_staff 是一个变量,有且仅有一个值,它不是一个数组或列表之类的东东,也不是一个数组列表之类的表达式,放在 in 里面,你凭什么让 in 把它当成一个列表处理?
一起混吧 2017-01-16
  • 打赏
  • 举报
回复
难道in()里面不支持变量?
一起混吧 2017-01-16
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
在 staff_id IN(next_staff); 中, next_staff 是一个值,不是一个值列表,删除一个是对的 删除多个的话,用 find_in_set(staff_id, next_staff)
谢谢,next_staff 是一个值列表,代码中用GROUP_CONCAT函数组织的,改成find_in_set 确实可以,但是用in就只能删除一个。奇了怪了。
zjcxc 2017-01-16
  • 打赏
  • 举报
回复
在 staff_id IN(next_staff); 中, next_staff 是一个值,不是一个值列表,删除一个是对的 删除多个的话,用 find_in_set(staff_id, next_staff)

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧