2017-02-28 94 views
0

我正在編寫一個存儲過程來管理公司中的員工離職。應該定期向每位員工記入休假。在調用存儲過程中的函數時發生錯誤

我的代碼如下

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 ; 
我使用笨

。後來,當我做

$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; 

內部查詢返回的輸出:

Click Here

然後我再插入功能

  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 ; 

但它顯示的錯誤,如下圖所示與inseterLeave#1304 - FUNCTION inserter already exists

+1

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中(** 25年**之前!)用老式*逗號分隔的表*樣式列表替換爲* proper * ANSI'JOIN'語法! ),不鼓勵使用它 –

+1

閱讀起來不太好,用'WHERE'子句將它作爲'INNER JOIN'運行,但是如果沒有它,它將執行(笛卡爾)'CROSS JOIN' ...我個人比較喜歡但是如果在'FROM'中做了這麼糟糕的話,那麼現在已經適當的棄用了... –

回答

0

請重新命名。

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關鍵字call functionprocedure。我已根據它進行了更改。

 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是內置functionFunction同名already exist。希望這會幫助你。

+0

這是可以的。但DUAL的意思是什麼。它是臨時表的名稱還是任何特殊有意義的關鍵字? – Sam

+0

默認情況下,它只存在於'MySQL'的所有模式中的特殊行.'DUAL'可以被每個用戶訪問。 –

+0

好的。非常感謝你 – Sam

相關問題