2017-02-28 1 views
0

Aufruf ich eine gespeicherte Prozedur schreibe Blätter der Mitarbeiter eines Unternehmens zu verwalten. Urlaub sollte regelmäßig jedem Mitarbeiter gutgeschrieben werden.Fehler bekommen, wenn Funktionen innerhalb gespeicherte Prozedur

Mein Code ist wie folgt

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 ; 

ich codeigniter verwende. Dann, wenn ich

$this->db->query("CALL start_credit_test();"); 

Ich erhalte eine Fehlermeldung:

PROCEDURE abn_erp.inserter does not exist

Die Abfrage innerhalb der Prozedur

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; 

gibt den Ausgang:

Click Here

Dann habe ich eingefügt Funktion wieder als

  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 ; 

Aber es zeigt den Fehler #1304 - FUNCTION inserter already exists

+1

[Schlechte Gewohnheiten zu treten: mit altem Stil JOIN] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) -, dass im alten Stil * durch Kommata getrennte Liste von Tabellen * Stil mit der * richtigen ersetzt wurde * ANSI 'JOIN' Syntax in der ANSI - ** 92 ** SQL Standard (** 25 Jahre ** vor!) und seine Verwendung ist –

+1

Nicht so schön lesen entmutigt, mit 'WHERE' Klauseln, damit sie als' INNER JOIN' sowieso laufen wird, aber ohne eine (Cartesian) 'CROSS JOIN' ... ich persönlich eher das tun Verwendung explizit Join-Syntax jedoch, wenn dadurch in in einem 'FROM' war so schlecht, es jetzt richtig als veraltet wäre ... –

Antwort

0

umbenennen Bitte mit inseterLeave wie unten gezeigt.

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 ; 

und Neuschreiben mit untenstehenden Code.

Sie müssen nicht call Schlüsselwort call function von procedure .Ich Änderungen vorgenommen hatte es nach.

 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 ; 

Ich denke inseter ist eingebaute function oder Function mit demselben Namen already exist .Hope dies wird Ihnen hilft.

+0

es ist OK. aber was ist DUAL? Ist es der Name einer temporären Tabelle oder eines speziellen sinnvollen Schlüsselworts? – Sam

+0

es ist nur spezielle eine Zeile standardmäßig in allen Schema von 'MySQL' .Dual 'kann von jedem Benutzer zugegriffen werden. –

+0

Ok. Vielen Dank – Sam

Verwandte Themen