2017-02-27 80 views
0

我试图编码存储的优先级来管理公司的树叶,因为树叶应定期记入每位员工。我使用的表我的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; 

而且它工作正常,没有问题。

Click here to see output

但在我的存储过程,这种查询是行不通的。我正在使用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 

所以,可以请你帮

+0

的函数必须是选择语句的一部分。 –

回答

0

谢谢大家。 我按照您的建议纠正了我的代码。并更改了我用存储过程声明的变量的名称。这是我改变 DECLARE lpc_id INT(11) DEFAULT 0; DECLARE emp_id BIGINT(20) DEFAULT 0; 作为 DECLARE my_lpc_id INT(11) DEFAULT 0; DECLARE my_emp_id BIGINT(20) DEFAULT 0; 后来我改变了 call inserter(emp_id,lpc_id); 作为 INSERT INTO aaa_test (aaa_emp_id,aaa_lpc_id) VALUES (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作为 Click Here

但是,当我调用函数我nserter,它再次得到错误

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_credit_test()作为 $this->db->query("CALL start_credit_test();") 得到错误的PROCEDURE abn_erp.inserter does not exist

+0

Sagar Gangwal解决了这个问题http://stackoverflow.com/questions/42502307/getting -errors-当呼函数-内部-存储过程 – Sam

0

其对分隔符

$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 ; "; 
+0

在codeigniter中以'$ this-> db-> query($ q)'运行时出错。错误如下:'你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在'DELIMITER $$ CREATE PROCEDURE start_credit_test()BEGIN DECLARE v'第1行附近使用正确的语法。但是在PhpMyAdmin中运行时没有错误。但没有插入到表中'aaa_test' – Sam

+0

请检查更新后的答案 –

+0

代码运行在WAMP的phpMyadmin中。但是,当使用codeigniter'$ this-> db-> querry($ q)'时,它显示我上面评论的错误。但要运行在phpMyadmin我改变了一些东西。 'inserter(emp_id,lpc_id);'as'调用inserter(emp_id,lpc_id);'和END $$'作为'END $$;' – Sam

0

附近inserter程序调用的语法错误的问题,你应该使用CALL命令 -

... 
CALL inserter(emp_id,lpc_id); 
... 

再一个,我觉得你可以简化你的任务:

  1. 只使用一个存储过程,甚至只是一个声明 -
  2. 使用
  3. 避免光标

有是一个INSERT...SELECT statement,它将来自另一个数据集的记录插入到一​​个命令中,例如 -

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; 
+0

好吧,当我使用'CALL inserter(emp_id,lpc_id);'错误已被删除。但是当运行我的查询时,没有任何东西被插入到表'aaa_test'中(不是你所建议的查询,因为我的需求没有在表'aaa_test'中插入任何东西,仅仅是一个例子,在这个过程中还有一些过程需要做存储过程 – Sam

+0

SELECT必须返回记录检查它我建议使用INSERT ... SELECT语句 – Devart

+0

如果你想检查过程的问题,你可以用我们的mysql调试器来调试它 - https:// www.devart.com/dbforge/mysql/studio/code-debugger.html#header。试用版 – Devart

0

错误可能被包含在:DECLARE v_finished INTEGER DEFAULT 0;

变化:DECLARE v_finished INT(11) DEFAULT 0;

+0

结果中未发现变化 – Sam