Я получаю эту ошибку в следующей процедуре в строке 'DECLARE v_cycle_count INT DEFAULT -1;
. Если я удалю блок IF - IF pid IS NULL
, ошибка мигрирует в DECLARE v_job_id INT DEFAULT -1;
. Если я также удалю код от -- Look if already running cycle
до следующего END IF
, код успешно компилируется. Я не могу понять, что такое ошибка в двух блоках.ERROR 1064 (42000): У вас есть ошибка в синтаксисе SQL. Получение ошибки синтаксиса при создании процедуры
DELIMITER $$
CREATE PROCEDURE startNewCycle(IN pid_in INT, OUT cycleId INT)
BEGIN
DECLARE no_initial_job CONDITION FOR SQLSTATE '45000';
DECLARE already_running_cycle CONDITION FOR SQLSTATE '45000';
DECLARE invalid_input CONDITION FOR SQLSTATE '45000';
IF pid_in IS NULL THEN
SIGNAL invalid_input SET MESSAGE_TEXT = 'process id is null';
END IF;
-- Look if already running cycle for this process
DECLARE v_cycle_count INT DEFAULT -1;
SELECT count(cycle_id) INTO v_cycle_count FROM cycle_tracking WHERE pid = pid_in AND status = 'RUNNING';
IF v_cycle_count > 0 THEN
SIGNAL already_running_cycle SET MESSAGE_TEXT = 'There is already running cycle for this process.';
END IF;
-- Look for starting job for the input process id
DECLARE v_job_id INT DEFAULT -1;
SELECT job_id INTO v_job_id FROM job WHERE job_id NOT IN (SELECT next_job FROM job WHERE pid = pid_in AND next_job IS NOT NULL) AND pid = pid_in;
IF v_job_id IS NULL OR v_job_id = -1 THEN
SET @message_text = CONCAT('There is no initial job for process : ', pid_in);
SIGNAL no_initial_job SET MESSAGE_TEXT = @message_text;
END IF;
-- start the cycle
INSERT INTO cycle_tracking(pid, start_date, status) VALUES (pid_in, NOW(), 'RUNNING');
SET cycleId = LAST_INSERT_ID();
-- signal the initial job
INSERT INTO job_tracking(cycle_id, pid, job_id, status)
VALUES (cycleId, pid_in, v_job_id, 'WAITING_TO_START');
END $$
DELIMITER ;
Вы не проводите никаких исследований вообще. Таким образом, 1. –