MySQL:运行一个存储过程,从另一个存储过程中的查询中获取参数

MySQL:运行一个存储过程,从另一个存储过程中的查询中获取参数,mysql,stored-procedures,Mysql,Stored Procedures,我是MySQL新手 我正在开发一个系统,其中许多用户被分配到特定的任务。当他们在一段时间内(比如说超过10分钟)处于非活动状态时,我希望系统自动清除他们的任务,以便其他人可以处理这些任务 为了实现这一点,我创建了一个名为的表,用于活动跟踪。作业位于名为的表中。我创建了一个存储过程来获取非活动用户 下面是一个SQLFIDLE示例: 在上面的示例中,我得到了3个非活动用户:auditor1、auditor2和auditor3 我已经创建了一个存储过程来清除单个用户的分配,这样就可以完美地完成任务 C

我是MySQL新手

我正在开发一个系统,其中许多用户被分配到特定的任务。当他们在一段时间内(比如说超过10分钟)处于非活动状态时,我希望系统自动清除他们的任务,以便其他人可以处理这些任务

为了实现这一点,我创建了一个名为的表,用于活动跟踪。作业位于名为的表中。我创建了一个存储过程来获取非活动用户

下面是一个SQLFIDLE示例:

在上面的示例中,我得到了3个非活动用户:auditor1、auditor2和auditor3

我已经创建了一个存储过程来清除单个用户的分配,这样就可以完美地完成任务

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
...