Я пишу хранимую процедуру для управления листами сотрудников в компании. Отпуск должен быть зачислен на каждого сотрудника периодически.
Мой код выглядит следующим образом
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
Надеюсь, это поможет вам.