2015-06-08 2 views
-2

Я получаю эту ошибку в следующей процедуре в строке '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 ; 
+0

Вы не проводите никаких исследований вообще. Таким образом, 1. –

ответ

1

Написано явно в the documentation for DECLARE:

DECLARE разрешается только внутри BEGIN ... END составного оператора а и должно быть в его начале, перед любыми другими операторами.

Поэтому переместите объявления в начало процедуры. И прочитайте документацию !!

0

DECLARE идет первым. попробуйте это:

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'; 
    -- Look if already running cycle for this process 
    DECLARE v_cycle_count INT DEFAULT -1; 
    -- Look for starting job for the input process id 
    DECLARE v_job_id INT DEFAULT -1; 

    IF pid_in IS NULL THEN 
     SIGNAL invalid_input SET MESSAGE_TEXT = 'process id is null'; 
    END IF; 

    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; 

    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 ;