хранимая функция mysql: как выбрать несколько результатов и обработать их

#mysql #stored-functions

#mysql #хранимые функции

Вопрос:

хранимая функция mysql: как выбрать несколько результатов и обработать их. Например,

 create function hello() return decimal(10,2) determistic begin

   select value1, value2 from Foo;
   // process multiple rows in result set here
   for (....) {

   }

 end
  

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

1. dev.mysql.com/doc/refman/8.0/en/cursors.html

Ответ №1:

https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html говорит:

Инструкции, возвращающие набор результатов, могут использоваться в хранимой процедуре, но не в хранимой функции.

Вы не можете работать select ... from Foo в хранимой функции так, как вы бы выполняли хранимую процедуру, потому что это select сгенерирует результирующий набор с несколькими столбцами и несколькими значениями.

Хранимая функция может возвращать только одно скалярное значение. В вашем примере вы возвращаете decimal(10,2) . Итак, что бы вы ни делали со своими запросами, результат должен заканчиваться выражением в инструкции RETURN.

Если вам нужно выполнить select запрос, вы можете сохранить результат в переменной, а затем вернуть эту переменную.

 ...
begin
  declare d decimal(10,2);
  select <expr> into d from Foo limit 1;
  return d;
end
  

Или вы можете запустить курсор (как предложено по ссылке, размещенной @stickybit выше в комментарии) и обработать результат запроса строка за строкой. Смотрите пример на этой странице документации: https://dev.mysql.com/doc/refman/8.0/en/cursors.html

Я не могу вдаваться в подробности, потому что вы не описали, что вы пытаетесь сделать со своей функцией, а приведенный вами пример не проясняет это.