我正在编写一个存储过程来管理公司员工的休假。应定期将休假记入每位员工。
我的代码如下
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();");
我收到错误:
PROCEDURE abn_erp.inserter does not exist
程序内的查询
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 插入器已存在
最佳答案
请使用 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
关键字来从 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
是内置函数
或具有相同名称的函数
已经存在
。希望这会对您有所帮助.
关于php - 在存储过程中调用函数时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502307/