我試圖編碼存儲的優先級來管理公司的樹葉,因爲樹葉應定期記入每位員工。我使用的表我的Sql存儲的優先級不能正常工作
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
我嘗試這個代碼而不調用函數插入器()通過用
INSERT INTO aaa_test (aaa_lpc_id,aaa_emp_id) VALUES (lpc_id, emp_id);
現在沒有顯示錯誤替換inserter(emp_id,lpc_id);
。但是沒有任何內容被插入到表aaa_test中。 同樣當在CREATE PROCEDURE start_credit_test()
之前使用DELIMITER //
,並且當我撥打$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 'DELIMITER // CREATE PROCEDURE start_credit_test() BEGI' at line 1
所以,可以請你幫
的函數必須是選擇語句的一部分。 –