Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的Sql存储过程无法正常工作_Php_Mysql_Codeigniter - Fatal编程技术网

Php 我的Sql存储过程无法正常工作

Php 我的Sql存储过程无法正常工作,php,mysql,codeigniter,Php,Mysql,Codeigniter,我正试图编码存储过程来管理公司的假期,因为假期应该定期记入每位员工的贷方。我在用桌子 erp_leave_policy => Describing Leave policy, erp_employees => Describing Employees, erp_clients => Describing Employees are belonged to which Client, erp_employee_leave_policy => Descr

我正试图编码存储过程来管理公司的假期,因为假期应该定期记入每位员工的贷方。我在用桌子

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 
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
我尝试了这段代码,没有调用函数inserter(),而是替换了
inserter(emp\u id,lpc\u id)带有

INSERT INTO aaa_test (aaa_lpc_id,aaa_emp_id) VALUES (lpc_id, emp_id);
现在它不显示错误。但表aaa_测试中没有插入任何内容。 另外,在
创建过程开始\u credit\u test()
之前使用
分隔符/
时,以及调用
$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 '(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 
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

所以你能帮个忙吗

这是一个关于定界符的问题

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

插入器
过程调用附近的语法错误,应使用CALL命令-

...
CALL inserter(emp_id,lpc_id);
...
另一个,我认为你可以简化你的任务:

  • 只使用一个存储过程,甚至只使用一条语句-
  • 避免使用光标
  • 例如,在一个命令中插入来自另一个数据集的记录-

    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;
    

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

    更改为:
    DECLARE v_finished INT(11)默认值0

    谢谢大家。 我按照你的建议更正了代码。并更改了我用存储过程声明的变量的名称。那是我换的
    声明lpc_id INT(11)默认值为0;
    声明emp_id BIGINT(20)默认为0
    作为
    
    声明my_lpc_id INT(11)默认为0;
    声明my_emp_id BIGINT(20)默认值为0
    然后我改变了
    
    呼叫插入器(emp\u id、lpc\u id)
    作为
    
    插入aaa_测试(aaa_emp_id,aaa_lpc_id)值(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中插入值,如下所示

    但当我调用函数插入器时,它再次出错

    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\u credit\u test()作为
    $this->db->query(“callstart_credit_test();”)

    作为
    过程abn_erp.inserter获取错误不存在

    函数必须是select语句的一部分。当作为
    $this->db->query($q)
    在codeigniter中运行时,该函数获取错误。错误如下:
    您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在第1行“DELIMITER$$CREATE PROCEDURE start\u credit\u test()BEGIN DECLARE v”附近使用的正确语法。但在PhpMyAdmin中运行时,没有错误。但是没有插入表
    aaa\u test
    该代码正在WAMP的phpMyadmin中运行。但是当使用codeigniter
    $this->db->query($q)
    时,它显示了我上面评论的错误。但是为了在phpMyadmin中运行,我改变了一些东西<代码>插入器(emp\U id、lpc\U id)as
    呼叫插入器(emp\u id,lpc\u id)
    END$$
    作为
    END$$确定,当我使用
    调用插入器(emp\u id,lpc\u id)时已删除错误。但是在运行我的查询时,没有向表
    aaa\u test
    插入任何内容(不是您建议的查询。因为我的需要不是在表
    aaa\u test
    中插入任何内容。这只是一个示例。在这个存储过程中还有一些过程要做。SELECT必须返回记录。请检查它。我建议使用INSERT…SELECT语句。如果您想检查该过程的问题,可以使用我们的mysql调试器-.试用版。在结果中未发现任何更改。Gar Gangwal解决了该问题