2016-04-11 3 views
0

Итак, я искал все места, пытаясь увидеть, как я могу вызвать функцию внутри хранимой процедуры, и вот этот пример нашел здесь: http://forums.mysql.com/read.php?98,175470,175476#msg-175476.MySQL вызывает хранимую процедуру внутри функции

Это помог мне структурировать функции для вызова хранимой процедуры, но я получаю эту ошибку:

16:17:51 select regionUtilization(1,2) LIMIT 0, 1000 Error Code: 1415. Not allowed to return a result set from a function 0.000 sec 

То, что я пытаюсь сделать, это вызвать следующую хранимую процедуру и доступ к переменному OUT. Затем сравните это с введенным целым числом сравнения.

drop procedure if exists select_employeesByRegion_proc; 
delimiter // 
create procedure select_employeesByRegion_proc 
(in search int, out result int) 
    begin 
     select t1.emp_id from (
     select employees.emp_id from branch 
     inner join department 
     on department.br_id = branch.br_id 
     inner join employees 
     on employees.dep_id = department.dep_id 
     where branch.reg_id = search) as t1; 
    set result:=FOUND_ROWS(); 
    end // 
delimiter ; 

Ниже приведена функция, которую я в настоящее время имею.

drop function if exists regionUtilization; 
delimiter // 
create function regionUtilization(search int, compare int) 
    returns boolean 
begin 
    DECLARE temp int; 
    call select_employeesByRegion_proc(search, temp); 
    if temp >= compare then 
     return true; 
    else 
     return false; 
    end if; 
end // 
delimiter ; 

Я также посмотрел в отделяя два аспекта хранимой процедуры в отдельные процедуры, имея один счет и другие результаты возвращения, однако это будет по-прежнему сначала необходимо процедура, чтобы выбрать некоторые данные, которые могли бы привести та же ошибка, что и я.

Любые предложения о том, как обойти ошибку набора результатов? Я не возвращаю результат, я просто использую этот набор результатов, чтобы выбрать, следует ли возвращать true или false в моей функции. Заранее спасибо!

+0

Процедура должна использовать курсор для обработки результатов запроса, чтобы он не возвращал результаты запроса. – Barmar

ответ

0

Спасибо @Бармар за ответ. Да, мне нужно было использовать курсор в моей процедуре, чтобы объявить мою функцию соответствующим образом.

drop procedure if exists build_regionUtil_proc; 
delimiter // 
create procedure build_regionUtil_proc(in search int, inout result int) 
    begin 
     declare v_finished integer default 0; 
     declare v_list int default 0; 
     declare region_cursor cursor for 
      select t1.emp_id from (
      select employees.emp_id from branch 
      inner join department 
      on department.br_id = branch.br_id 
      inner join employees 
      on employees.dep_id = department.dep_id 
      where branch.reg_id = search) as t1; 
     declare continue handler 
      for not found set v_finished = 1; 
     open region_cursor; 
     get_results: loop 
      fetch region_cursor into v_list; 
      if v_finished = 1 then leave get_results; 
      end if; 
      set result = result + 1; 
     end loop get_results; 
     close region_cursor; 
    end // 
delimiter ;