MySQL:运行一个存储过程,从另一个存储过程中的查询中获取参数
我是MySQL新手 我正在开发一个系统,其中许多用户被分配到特定的任务。当他们在一段时间内(比如说超过10分钟)处于非活动状态时,我希望系统自动清除他们的任务,以便其他人可以处理这些任务 为了实现这一点,我创建了一个名为的表,用于活动跟踪。作业位于名为的表中。我创建了一个存储过程来获取非活动用户 下面是一个SQLFIDLE示例: 在上面的示例中,我得到了3个非活动用户:auditor1、auditor2和auditor3 我已经创建了一个存储过程来清除单个用户的分配,这样就可以完美地完成任务MySQL:运行一个存储过程,从另一个存储过程中的查询中获取参数,mysql,stored-procedures,Mysql,Stored Procedures,我是MySQL新手 我正在开发一个系统,其中许多用户被分配到特定的任务。当他们在一段时间内(比如说超过10分钟)处于非活动状态时,我希望系统自动清除他们的任务,以便其他人可以处理这些任务 为了实现这一点,我创建了一个名为的表,用于活动跟踪。作业位于名为的表中。我创建了一个存储过程来获取非活动用户 下面是一个SQLFIDLE示例: 在上面的示例中,我得到了3个非活动用户:auditor1、auditor2和auditor3 我已经创建了一个存储过程来清除单个用户的分配,这样就可以完美地完成任务 C
CREATE PROCEDURE `spClearAssignedInquiry`(IN `pAssignedTo` VARCHAR(50))
UPDATE
tblinquiries
SET
AuditStatus='Check', AssignedTo=NULL, Result=NULL,
ResultCategories=NULL, AuditBy=NULL,
Remarks=NULL, StartTime=NULL, EndTime=NULL
WHERE
AssignedTo=pAssignedTo AND
AuditStatus='Assigned' AND EndTime IS NULL
如果我在上述过程中将auditor1作为参数传递,它将清除用户的分配
为了一次性通过所有非活动用户并清除分配,我尝试了以下步骤:
但它没有明确任何任务
这几天我的头都撞到墙上了。任何帮助都将不胜感激。提前谢谢 您使用的变量名也是列的名称。变量值将优先于列值,请参见: 局部变量不应与表列具有相同的名称。如果SQL语句,如SELECT。。。INTO语句,包含对列的引用和具有相同名称的已声明局部变量,MySQL当前将该引用解释为变量的名称 所以在 您选择的是分配给的变量
(即null
),而不是表中的列
只需重命名它(在declare
和循环中),或者,不太建议,显式地声明表名以设置范围,例如selectinquiryid,tblinquiries.AssignedTo。。。。按TBL需求订购。分配到
另一个(次要)问题是在TIMEDIFF(MAX(LastActivity),CURRENT_TIMESTAMP())
中使用。如果要获得一个正数(如q2.InactiveMinutes>10
),则需要在第一个参数中的较晚时间。单独运行查询时没有任何问题。这是小提琴中的数据:非常感谢!我重命名了变量,这就成功了。
CREATE PROCEDURE `spInactiveUsers`()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE AssignedTo VARCHAR(50);
DECLARE cur CURSOR FOR
SELECT
q1.AssignedTo AS AssignedTo
FROM
(SELECT
InquiryId, AssignedTo
FROM
tblinquiries
WHERE
AuditStatus='Assigned' AND StartTime IS NOT NULL AND EndTime IS NULL
ORDER BY
AssignedTo ASC
) q1
RIGHT JOIN
(SELECT
UserId, MAX(LastActivity) AS LastActivity, ROUND(TIME_TO_SEC(TIMEDIFF(MAX(LastActivity),CURRENT_TIMESTAMP()))/60,0) AS InactiveMinutes
FROM
tblactivitytracker
GROUP BY
UserId
ORDER BY
LastActivity ASC
) q2
ON
q2.UserId=q1.AssignedTo
WHERE
q2.InactiveMinutes>10;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN cur;
testLoop: LOOP
FETCH cur INTO AssignedTo;
IF done THEN
LEAVE testLoop;
END IF;
CALL spClearAssignedInquiry(AssignedTo);
END LOOP testLoop;
CLOSE cur;
END
...
FROM
(SELECT
InquiryId, AssignedTo
...