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:
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
[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 –
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 ... –