2017-02-27 38 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