Последовательность инструкций MySQL if в хранимой функции

#mysql #if-statement #sequence #stored-functions

#mysql #if-statement #последовательность #сохраненные функции

Вопрос:

У меня особая проблема с использованием инструкции IF в MYSQL. У меня есть сохраненная функция, которая возвращает содержимое таблицы в виде строки. Чтобы моя строка возвращала правильное количество результатов, я готовлю инструкцию select на основе числа. если число равно <= 9, то используется одна инструкция sql, а выше 9 — другая.

Однако в последовательности я могу поместить оператор if только в конец моей функции. Если я помещу ее в правильное место, где она в данный момент закомментирована, это выдаст мне синтаксическую ошибку. Если я помещаю инструкцию if в конце функции в неправильном месте, я не получаю сообщение об ошибке.

Пожалуйста, помогите. Я не знаю, ошибка это или моя собственная ошибка.

 DELIMITER $$

CREATE DEFINER=`root`@`localhost` FUNCTION `returnstring`(IDGrade int) RETURNS varchar(255) CHARSET latin1
BEGIN
Declare fSubjectID, sSubjectID varchar (255);
declare sqlstatement varchar(255);

#Declare variable for done of loop
Declare done int default 0;

#Declare variables from the select statement
#IF     IDGRADE <= 9 then set sqlstatement = 'SELECT subjectID FROM subjecttb where sectType = "b" or secttype = "j" order by subjectID';
#ELSEIF IDGRADE > 9  then set sqlstatement = 'SELECT subjectID FROM subjecttb where sectType = "b" or secttype = "s" order by subjectID';
#END IF; 


#Declare a cursor to iterate through the table
declare cursor1 cursor for 
        SELECT subjectID
        FROM `marksdb`.`subjecttb` 
        where sectType = 'b' or secttype = 'j' order by subjectID;

#Continue loop until nothing is found anymore
declare continue handler for not found set done=1;

#Runs the select statement
open cursor1;

#Declares a loop
set fsubjectid='';
SubjectID_loop:loop
    Fetch cursor1 into sSubjectID;
    if done=1 then # no more rows to fetch
          leave SubjectID_loop;
    end if;
    set fSubjectID = concat(fSubjectID, sSubjectID , ' varchar (255), ');
end loop SubjectID_loop;
set fSubjectID = substring(fSubjectID, 1, length(fsubjectid)-2);
close cursor1;

return fSubjectID;

#Declare variables from the select statement
IF IDGRADE <= 9 then set sqlstatement = 'SELECT subjectID FROM subjecttb where sectType = "b" or secttype = "j" order by subjectID';
ELSEIF IDGRADE > 9  then set sqlstatement = 'SELECT subjectID FROM subjecttb where sectType = "b" or secttype = "s" order by subjectID';
END IF; 
  

ЗАВЕРШЕНИЕ

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

1. Найден ответ. Курсоры не могут использоваться после типа выбора!!

Ответ №1:

Проблема, с которой вы сталкиваетесь в вашем сегменте кода, заключается в порядке ваших инструкций. Вы выполняете инструкцию SET перед инструкциями declaration. Инструкции должны быть упорядочены следующим образом:

  1. Объявления переменных и условий.
  2. Объявления курсора.
  3. Объявления обработчиков.
  4. Программный код.

Попробуйте упорядочить свою функцию, как описано выше, и она должна сработать. Также не забудьте добавить END $ $ к вашей функции.