2016-04-11 26 views
0

Bu nedenle, saklı bir yordamın içinde bir işlevi nasıl arayabileceğimi görmeye çalışırken her yere baktım ve buradaki örnekte şu adresi buldum: http://forums.mysql.com/read.php?98,175470,175476#msg-175476.MySQL Bir İşlev İçinde Depolanmış Yordamı Çağır

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 

Ne yapmaya çalışıyorum saklı yordamını çağırmak ve ÇIKIŞ değişken erişmek geçerli:

Bu

ancak bu hatayı almaya devam me yordamını aramak için benim işlevi yapısı yardımcı oldu. Ardından, girilen karşılaştırmalı tam sayıyla karşılaştırın.

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 ; 

Aşağıda, şu anda sahip olduğum işlev var.

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 ; 

Ben de bir sayımı ve diğer dönüş sonuçlarını alarak ayrı prosedürler içine saklı yordam iki boyutunu dışarı ayıran içine baktım, ancak bu hala ilk neden olacak bazı verileri seçmek için prosedürü gerektirir zaten aldığımla aynı hata.

Sonuç kümesi hatası nasıl çözüleceğine dair herhangi bir öneriniz var mı? Sonuç kümesini iade etmiyorum, yalnızca bu sonuç kümesini işlevimde doğru veya yanlış döndürüp döndürmeyeceğimi seçmek için kullanıyorum. Şimdiden teşekkürler!

+0

Yordam, sorgunun sonuçlarını işlemek için bir imleç kullanmalıdır, böylece sorgu sonuçlarını döndürmez. – Barmar

cevap

0

Cevabınız için teşekkür ederiz @Barmar. Evet, işlevimi uygun şekilde bildirmek için bir imleci prosedürümde kullanmam gerekiyordu.

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 ; 
İlgili konular