【问题标题】:Error Number: 1172 Result consisted of more than one row错误号:1172 结果包含多于一行
【发布时间】:2017-03-02 18:44:36
【问题描述】:

我正在尝试制作一个存储过程来为员工申请休假。我的存储过程如下

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 ; 

【问题讨论】:

    标签: mysql


    【解决方案1】:

    SELECT 查询返回多于一行,因此它类似于数组。然后您尝试将此数组值传递给标量变量 cur_date。

    MySQL 中没有类似数组的类型。作为一种解决方法,您可以使用临时表来存储这些数组值。使用 INSERT..SELECT 语句用结果数据集填充表。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2021-03-21
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多