我正在尝试制作一个存储过程来为员工申请离职。我的存储过程如下
DELIMITER $$;
CREATE PROCEDURE start_crediting(IN elc_date date)
BEGIN
DECLARE cur_date DATE DEFAULT NULL;
SELECT set_credit_values(emp_id,lpc_id,elc_date) INTO cur_date
FROM erp_leave_policy,erp_employees,erp_clients,erp_employee_leave_policy
WHERE emp_status=1 AND cli_status=1 AND lpc_status=1 AND
emp_id = elp_fk_employees AND lpc_id = elp_fk_leave_policy AND cli_id = emp_fk_clients;
END $$;
DELIMITER ;
当我调用该过程时出现以下错误
Error Number: 1172
Result consisted of more than one row
CALL start_crediting('2017-02-01')
我需要将SELECT查询中的每一行传递给函数set_credit_values()。我测试了SELECT查询,它有两行正常工作。当我使用光标单独传递每一行时,它正常工作。
但在我的实时服务器中有数百名员工。所以我认为可能需要更多时间。以下查询成功运行,相当于上面的查询,但在此处使用游标为每一行调用函数set_credit_values
。所以它可能比上面的查询慢。我需要一个快速工作的解决方案。
DELIMITER $$;
CREATE PROCEDURE start_crediting(IN elc_date date)
BEGIN
DECLARE v_finished INT(11) DEFAULT 0;
DECLARE my_lpc_id INT(11) DEFAULT 0;
DECLARE my_emp_id BIGINT(20) DEFAULT 0;
DEClARE emp_cursor CURSOR FOR
-- Taking all active employees with their leave policy, those are having a leave policy assigned.
SELECT lpc_id,emp_id FROM erp_leave_policy,erp_employees,erp_clients,erp_employee_leave_policy
WHERE emp_status=1 AND cli_status=1 AND lpc_status=1 AND
emp_id = elp_fk_employees AND lpc_id = elp_fk_leave_policy AND cli_id = emp_fk_clients;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
OPEN emp_cursor;
get_emp: LOOP
FETCH emp_cursor INTO my_lpc_id,my_emp_id;
IF v_finished = 1 THEN
LEAVE get_emp;
END IF;
-- calling function inseterLeave()
SELECT set_credit_values(my_emp_id,my_lpc_id,elc_date) FROM DUAL;
END LOOP get_emp;
CLOSE emp_cursor;
END $$;
DELIMITER ;
答案 0 :(得分:1)
SELECT查询返回多行,因此它类似于数组。然后你试图将这个数组值传递给标量变量cur_date。
MySQL中没有类似数组的类型。作为一种解决方法,您可以使用临时表来存储这些数组值。使用INSERT..SELECT语句用结果数据集填充表。