Php 我的Sql存储过程无法正常工作
我正试图编码存储过程来管理公司的假期,因为假期应该定期记入每位员工的贷方。我在用桌子Php 我的Sql存储过程无法正常工作,php,mysql,codeigniter,Php,Mysql,Codeigniter,我正试图编码存储过程来管理公司的假期,因为假期应该定期记入每位员工的贷方。我在用桌子 erp_leave_policy => Describing Leave policy, erp_employees => Describing Employees, erp_clients => Describing Employees are belonged to which Client, erp_employee_leave_policy => Descr
erp_leave_policy => Describing Leave policy,
erp_employees => Describing Employees,
erp_clients => Describing Employees are belonged to which Client,
erp_employee_leave_policy => Describing leave policy of employees.
我正在对存储过程使用以下查询
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;
它工作正常,没有任何问题
但是在我的存储过程中,这个查询不起作用。我正在使用codeigniter。我的代码如下
$this->db->query("DROP FUNCTION IF EXISTS inserter;");
$q = " CREATE FUNCTION inserter(emp_id bigint,lpc_id int) RETURNS boolean DETERMINISTIC
BEGIN
INSERT INTO aaa_test (aaa_lpc_id,aaa_emp_id) VALUES (lpc_id, emp_id);
RETURN 1;
END;";
$this->db->query($q);
$this->db->query("DROP PROCEDURE IF EXISTS start_credit_test;");
$q = " CREATE PROCEDURE start_credit_test()
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE lpc_id INT(11) DEFAULT 0;
DECLARE 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 lpc_id,emp_id;
IF v_finished = 1 THEN
LEAVE get_emp;
END IF;
inserter(emp_id,lpc_id);
END LOOP get_emp;
CLOSE emp_cursor;
END ";
$this->db->query($q);
$query = $this->db->query("CALL start_credit_test();");
错误如下
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(emp_id,lpc_id); END LOOP get_emp; CLO' at line 27
CREATE PROCEDURE start_credit_test() BEGIN DECLARE v_finished INTEGER DEFAULT 0; DECLARE lpc_id INT(11) DEFAULT 0; DECLARE 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 lpc_id,emp_id; IF v_finished = 1 THEN LEAVE get_emp; END IF; inserter(emp_id,lpc_id); END LOOP get_emp; CLOSE emp_cursor; END
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE start_credit_test() BEGI' at line 1
我尝试了这段代码,没有调用函数inserter(),而是替换了inserter(emp\u id,lpc\u id)代码>带有
INSERT INTO aaa_test (aaa_lpc_id,aaa_emp_id) VALUES (lpc_id, emp_id);
现在它不显示错误。但表aaa_测试中没有插入任何内容。
另外,在创建过程开始\u credit\u test()
之前使用分隔符/
时,以及调用$this->db->query()
时,它也会显示错误。比如说
$q = " DELIMITER //
CREATE PROCEDURE start_credit_test()
BEGIN
.........
.............";
$this->db->query($q);
错误如下
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(emp_id,lpc_id); END LOOP get_emp; CLO' at line 27
CREATE PROCEDURE start_credit_test() BEGIN DECLARE v_finished INTEGER DEFAULT 0; DECLARE lpc_id INT(11) DEFAULT 0; DECLARE 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 lpc_id,emp_id; IF v_finished = 1 THEN LEAVE get_emp; END IF; inserter(emp_id,lpc_id); END LOOP get_emp; CLOSE emp_cursor; END
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE start_credit_test() BEGI' at line 1
所以你能帮个忙吗这是一个关于定界符的问题
$q = " DELIMITER $$;
CREATE PROCEDURE start_credit_test()
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE lpc_id INT(11) DEFAULT 0;
DECLARE 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 lpc_id,emp_id;
IF v_finished = 1 THEN
LEAVE get_emp;
END IF;
inserter(emp_id,lpc_id);
END LOOP get_emp;
CLOSE emp_cursor;
END$$
DELIMITER ; ";
插入器
过程调用附近的语法错误,应使用CALL命令-
...
CALL inserter(emp_id,lpc_id);
...
另一个,我认为你可以简化你的任务:
只使用一个存储过程,甚至只使用一条语句-
避免使用光标
例如,在一个命令中插入来自另一个数据集的记录-
INSERT INTO aaa_test (aaa_lpc_id, aaa_emp_id)
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 v_finished INTEGER DEFAULT 0代码>
更改为:DECLARE v_finished INT(11)默认值0代码>谢谢大家。
我按照你的建议更正了代码。并更改了我用存储过程声明的变量的名称。那是我换的
声明lpc_id INT(11)默认值为0;
声明emp_id BIGINT(20)默认为0代码>
作为
声明my_lpc_id INT(11)默认为0;
声明my_emp_id BIGINT(20)默认值为0代码>
然后我改变了
呼叫插入器(emp\u id、lpc\u id)代码>
作为
插入aaa_测试(aaa_emp_id,aaa_lpc_id)值(my_emp_id,my_lpc_id)代码>
现在我的总代码如下
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;
INSERT INTO aaa_test (aaa_emp_id,aaa_lpc_id) VALUES (my_emp_id,my_lpc_id);
END LOOP get_emp;
CLOSE emp_cursor;
END$$;
DELIMITER ;
它将在表aaa_test中插入值,如下所示
但当我调用函数插入器时,它再次出错
PROCEDURE abn_erp.inserter does not exist
我把我的全部代码放在下面
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 ;
但是当我调用start\u credit\u test()作为
$this->db->query(“callstart_credit_test();”)
作为过程abn_erp.inserter获取错误不存在
函数必须是select语句的一部分。当作为$this->db->query($q)
在codeigniter中运行时,该函数获取错误。错误如下:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在第1行“DELIMITER$$CREATE PROCEDURE start\u credit\u test()BEGIN DECLARE v”附近使用的正确语法。但在PhpMyAdmin中运行时,没有错误。但是没有插入表aaa\u test
该代码正在WAMP的phpMyadmin中运行。但是当使用codeigniter$this->db->query($q)
时,它显示了我上面评论的错误。但是为了在phpMyadmin中运行,我改变了一些东西<代码>插入器(emp\U id、lpc\U id)代码>as呼叫插入器(emp\u id,lpc\u id)代码>和END$$
作为END$$代码>确定,当我使用调用插入器(emp\u id,lpc\u id)时代码>已删除错误。但是在运行我的查询时,没有向表aaa\u test
插入任何内容(不是您建议的查询。因为我的需要不是在表aaa\u test
中插入任何内容。这只是一个示例。在这个存储过程中还有一些过程要做。SELECT必须返回记录。请检查它。我建议使用INSERT…SELECT语句。如果您想检查该过程的问题,可以使用我们的mysql调试器-.试用版。在结果中未发现任何更改。Gar Gangwal解决了该问题