Хранимые процедуры MySQL: объявление курсора

#mysql #sql #stored-procedures #cursor

#mysql #sql #хранимые процедуры #курсор

Вопрос:

Извините за расплывчатое название, вот в чем моя проблема. У меня есть хранимые процедуры для DB2, которые я пытаюсь преобразовать для MySQL. Я хотел бы знать, могу ли я записать оператор SELECT в объявлении курсора как строковую переменную. Например, в DB2 у меня есть это :

 (...)
-- Declare cursors
DECLARE c_very_init CURSOR WITH RETURN FOR s_very_init;
DECLARE c_date      CURSOR WITH RETURN FOR s_date;

DECLARE CONTINUE HANDLER FOR not_found
    SET at_end = 1;

-- In case the_date is 0, retrieve the first date
IF the_date = 0 THEN
    SET sql_end_date = '
        SELECT DATE 
            FROM ACCOUNTS 
        WHERE REF = ''' || the_ref || ''' 
            ORDER BY ID ASC FETCH FIRST 1 ROWS ONLY';
    PREPARE s_date FROM sql_end_date;
    OPEN c_date;
    FETCH FROM c_date INTO data_ins;
    SET the_last_date = data_ins;
    CLOSE c_date;
ELSE
    SET the_last_date = the_date;
END IF;

-- Get the 'very' initial value
SET sql_very_init = '
        SELECT in, out 
            FROM MOVEMENTS 
        WHERE REF = ''' || the_ref || ''' 
            AND DATE < ' || the_last_date;
PREPARE s_very_init FROM sql_very_init;
OPEN c_very_init;
FETCH FROM c_very_init INTO dare, avere;

-- Loop through the results
(...)
  

Я объявляю c_very_init курсор, но на момент объявления курсора в SP я все еще не знаю полного оператора select, потому что мне нужно извлечь (при необходимости) the_last_date значение. Кажется, я не могу этого сделать :

 DECLARE c_very_init CURSOR WITH RETURN FOR s_very_init;
  

в MySQL синтаксис соответствует инструкции непосредственно в объявлении :

 DECLARE c_very_init CURSOR FOR SELECT blaablaa...;
  

Я ошибаюсь?

Спасибо. fabien.

Ответ №1:

Нет, вы не можете объявлять курсоры таким образом. Но если ‘the_ref’ является переменной, вы могли бы сделать это следующим образом —

 ...
DECLARE the_ref INT DEFAULT 10;
DECLARE cur1 CURSOR FOR SELECT column1 FROM table1 WHERE column1 = the_ref;
...
  

Комментарии:

1. Спасибо за ваш ответ, Devart, хотя это на самом деле не помогает мне с моей проблемой. Я отредактировал свой вопрос с помощью более полного SP, который, я надеюсь, лучше объясняет мою проблему. Еще раз спасибо!