Alexiuscrow
@Alexiuscrow

Создание хранимой процедуры. В чём может быть проблема?

Есть простой запрос. Из этого запроса необходимо создать хранимую процедуру.
Запрос:
SELECT
  id, name, category, ROUND((
    1000 * 6371 * ACOS (
      COS ( RADIANS(51.42689) )
      * COS( RADIANS( latitude ) )
      * COS( RADIANS( longitude ) - RADIANS(31.42689) )
      + SIN ( RADIANS(51.522256) )
      * SIN( RADIANS( latitude ) )
    )
  ), 3) AS distance, address, latitude, longitude, 
  (SELECT name FROM localities WHERE id = locality_id) AS locality_name, locality_id
FROM shops
HAVING distance < 150
ORDER BY distance;


Создание хранимой процедуры из вышеописанного запроса:
DROP PROCEDURE IF EXISTS `get_nearest_shops`;
DELIMITER //
CREATE PROCEDURE get_nearest_shops(
	IN p_lat DOUBLE, 
	IN p_lng DOUBLE, 
    IN p_radius DOUBLE,
    OUT p_id INT(10),
    OUT p_name VARCHAR(45),
    OUT p_category ENUM('undefined','auto','children_prod','food','game','book',
                        'electronics','beuty&health','fashin','footwear','clothing',
                        'sports','homewere','pet_prod','services','gift&flowers'),
    OUT p_distance DOUBLE, 
    OUT p_latitude DOUBLE,
    OUT p_longitude DOUBLE,
    OUT p_locality VARCHAR(45),
    OUT p_locality_id INT(10))
BEGIN 
	DECLARE sign_after_point INT(10) DEFAULT 3;
	SELECT
		id, name, category, ROUND((
		1000 * 6371 * ACOS (
			COS ( RADIANS(p_lat) )
			* COS( RADIANS( latitude ) )
			* COS( RADIANS( longitude ) - RADIANS(p_lng) )
			+ SIN ( RADIANS(p_lat) )
			* SIN( RADIANS( latitude ) )
			)
		), sign_after_point) AS distance, latitude, longitude, 
        (SELECT name FROM localities WHERE id = locality_id) AS locality, 
        locality_id
	INTO
		p_id, p_name, p_category, p_distance, p_latitude, p_longitude, 
        p_locality, p_locality_id
    FROM shops
	HAVING distance < p_radius
	ORDER BY distance;
END;//


В результате хранимая процедура создаётся без единой ошибки но в отличии от простого запроса не выводит информацию, при том что входящие данные одинаковы.
В чем может быть ошибка?
Спасибо.
  • Вопрос задан
  • 314 просмотров
Решения вопроса 1
art_karetnikov
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Робею спросить, но если нужно, чтобы запрос вернул несколько строк - на кой вы его результат пихаете в out параметры? Не надо этого делать, оставьте просто select без всяких параметров он и вернет что нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vapaamies
@Vapaamies
В творческом кризисе
А не возвращается ли более одной строки в запросе? В другой СУБД от Oracle это приводит к явно видимой ошибке, где так и написано: "Запрос вернул более одной строки". В into так нельзя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы