2017-03-02 47 views
0

我正在嘗試使存儲過程爲員工應用離職。我的存儲過程如下錯誤號:1172結果包含多個行

​​

當我調用的程序收到以下錯誤

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 ; 

回答

1

SELECT查詢返回多於一行,所以它就像數組。然後你試圖將這個數組值傳遞給標量變量cur_date。

MySQL中沒有類似數組的類型。作爲一種解決方法,您可以使用臨時表來存儲這些數組值。使用INSERT..SELECT語句來填充結果數據集的表格。