Получение ошибок при вызове функций внутри хранимой процедуры

Я пишу хранимую процедуру для управления листами сотрудников в компании. Отпуск должен быть зачислен на каждого сотрудника периодически.

Мой код выглядит следующим образом

DROP FUNCTION IF EXISTS inserter; DELIMITER $$; CREATE FUNCTION inserter(emp_id bigint, lpc_id int) RETURNS boolean DETERMINISTIC BEGIN INSERT INTO aaa_test (aaa_emp_id,aaa_lpc_id) VALUES (emp_id,lpc_id); RETURN 1; END $$; DELIMITER ; DROP PROCEDURE IF EXISTS start_credit_test; DELIMITER $$; CREATE PROCEDURE start_credit_test() 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 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; call inserter(my_emp_id,my_lpc_id); END LOOP get_emp; CLOSE emp_cursor; END $$; DELIMITER ; 

Я использую codeigniter. Тогда, когда я это сделаю

 $this->db->query("CALL start_credit_test();"); 

Я получаю сообщение об ошибке:

ПРОЦЕДУРА abn_erp.inserter не существует

Запрос внутри процедуры

 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; 

возвращает результат:

Кликните сюда

Затем я снова вставил функцию

  DELIMITER $$; CREATE FUNCTION inserter(emp_id bigint, lpc_id int) RETURNS boolean DETERMINISTIC BEGIN INSERT INTO aaa_test (aaa_emp_id,aaa_lpc_id) VALUES (emp_id,lpc_id); RETURN 1; END $$; DELIMITER ; 

Но он показывает ошибку #1304 - FUNCTION inserter already exists

Переименуйте его с помощью inseterLeave как показано ниже.

 DELIMITER $$; CREATE FUNCTION inseterLeave (emp_id bigint, lpc_id int) RETURNS boolean DETERMINISTIC BEGIN INSERT INTO aaa_test (aaa_emp_id,aaa_lpc_id) VALUES (emp_id,lpc_id); RETURN 1; END $$; DELIMITER ; 

и переписать процедуру с помощью кода ниже.

Вам не нужно было call ключевое слово для call function из procedure Я внес изменения в соответствии с ним.

  DROP PROCEDURE IF EXISTS start_credit_test; DELIMITER $$; CREATE PROCEDURE start_credit_test() 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 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; SELECT inseterLeave(my_emp_id,my_lpc_id) FROM DUAL; <-- Please remove call keyword from this line.Function did not require call keyword!> END LOOP get_emp; CLOSE emp_cursor; END $$; DELIMITER ; 

Я думаю, что inseter – встроенная function или Function с тем же именем already exist Надеюсь, это поможет вам.