php - 在存储过程中调用函数时出现错误

标签 php mysql codeigniter

我正在编写一个存储过程来管理公司员工的休假。应定期将休假记入每位员工。

我的代码如下

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 ; 

我正在使用 codeigniter。然后当我这样做时

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

但它显示错误#1304 - FUNCTION 插入器已存在

最佳答案

请使用 inseterLeave 重命名它,如下所示。

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 关键字来从 procedure调用函数。我已根据它进行了更改。

       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是内置函数或具有相同名称的函数已经存在。希望这会对您有所帮助.

关于php - 在存储过程中调用函数时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502307/

相关文章:

php - CodeIgniter 选择并在 View 中显示结果

php - 使用 urlManager 在 url yii2 中隐藏一个 id

php - 如何在 PHP 中从 MySQL 数据库下载基于 blob 的文件?

javascript - APC 和 Codeigniter 的进度条 - IE 和 Chrome 的问题

php - 无法在 codeigniter 中销毁 session

javascript - 文件数组 javascript

mysql - drupal 中选择查询的正确语法是什么

mysql - 数据库中大量 MySQL 表的副作用

php - 使用表之间的 UNION 与 mySQL 进行运行平衡

来自 SQL Server 的 JavaScript 日期 : Codeigniter