2016-11-23 5 views
0

Вот мое упрощенное значение, значение строки rent_ids возвращает значение null после цикла. Я уже знаю, что цикл работает правильно и что значение rent_ids изменяется с каждым итеративным.Значение хранимой процедуры MySQL переменной возвращается к нулевому концу после завершения цикла

BEGIN 

DECLARE rent_ids VARCHAR(265); 
DECLARE tmp_rent_id int; 
create temporary table due_rent_ids (rent_id int); 
SET rent_ids = ""; 

set @test = "Insert into due_rent_ids (rent_id) select unit_id from tbl_rent"; 

PREPARE stmt1 FROM @test; 

EXECUTE stmt1; 

BEGIN 

     DECLARE cur1 CURSOR for select rent_id from due_rent_ids; 
     OPEN cur1; 

     read_loop: LOOP 
      FETCH cur1 INTO tmp_rent_id; 

      IF rent_ids = "" THEN 
       SET rent_ids = tmp_rent_id; 
      ELSE 
       SET rent_ids = concat(rent_ids, ", ", tmp_rent_id); 
      END IF; 

     END LOOP; 

     CLOSE cur1; 

END; 

select * from tbl_unit where unit_id in (rent_ids); 

DEALLOCATE PREPARE stmt1; 
END 
+0

Почему бы вам просто не использовать 'SELECT GROUP_CONCAT (rent_id) FROM due_rent_ids'? – Barmar

+0

'IN (rent_ids)' не будет разделять строку на запятую. Он просто ищет точное совпадение со всей строкой. – Barmar

ответ

0

Вы делаете все это неправильно. Вы не можете поместить строку с разделителями-запятыми в IN (...), запятые должны быть в реальном коде SQL.

Правильный способ сделать это:

SELECT * 
FROM tbl_unit 
WHERE unit_id IN (SELECT rent_id FROM due_rent_ids) 

Или:

SELECT t1.* 
FROM tbl_unit AS t1 
JOIN due_rent_ids AS t2 ON t1.unit_id = t2.rent_id 

Вторая форма, как правило, лучше работать в MySQL.

+0

Спасибо. Я начал цикл, пытаясь обработать набор результатов из инструкции execute без временной таблицы, поэтому после добавления таблицы temp я не рассматривал другие альтернативы. – zeina

 Смежные вопросы

  • Нет связанных вопросов^_^