В php, когда мы вызываем хранимую процедуру в цикле, она просто выполняется один раз.Это происходит, когда хранимая процедура возвращает какой-либо набор результатов.Я столкнулся с той же проблемой.У меня была хранимая процедура для обновления записей таблицы.
DELIMITER $$
DROP PROCEDURE IF EXISTS `espritkm`.`update_notification`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_notification`(item_id_val VARCHAR(11),item_source_val VARCHAR(50),item_type_id_val INT(50),item_type_val VARCHAR(50),created_at_val BIGINT(11),pivot_user_id_val VARCHAR(256),pivot_item_type_val VARCHAR(64),pivot_owner_type_val VARCHAR(64),pivot_owner_id_val INT(11),user_id_val VARCHAR(64), OUT row_effect VARCHAR(11))
Begin
Declare item_count INT(10);
SET @SQL1 = CONCAT('select count(*) into @item_count from item_notifications where item_id = ''', item_id_val, ''''); PREPARE S1 FROM @SQL1; EXECUTE S1; DEALLOCATE PREPARE S1;
IF @item_count = 0 THEN
SET @SQL2 = CONCAT('INSERT INTO item_notifications (item_id,item_source,item_type_id,item_type,created_at,pivot_user_id,pivot_item_type,pivot_owner_type,pivot_owner_id,user_id) value(''',item_id_val,''',''',item_source_val,''',''',item_type_id_val,''',''',item_type_val,''',''',created_at_val,''',''',pivot_user_id_val,''',''',pivot_item_type_val,''',''',pivot_owner_type_val,''',''',pivot_owner_id_val,''',''',user_id_val,''')');
PREPARE S2 FROM @SQL2; EXECUTE S2; DEALLOCATE PREPARE S2;
SET row_effect= "Insert";
ELSE
SET row_effect= "Update";
SET @SQL3 = CONCAT('UPDATE item_notifications SET viewer_id = ''',user_id_val,''' WHERE item_id = ''' ,item_id_val,'''') ;
PREPARE S3 FROM @SQL3; EXECUTE S3; DEALLOCATE PREPARE S3;
END IF;
SELECT row_effect;
END$$
DELIMITER ;
И это должно было быть выполнено для 1000+ строк, но выполнено только для одной записи.
В случаекогда ваш SP вернет какой-либо набор данных.Просто удалите переменную OUT или любой оператор select (только для ссылки на результат), и он будет работать нормально.