2016-05-16 2 views
0

В основном я имею следующую хранимую процедуру:MySql хранимой процедуры, как вставить более одной переменной с CONCAT

BEGIN 
SET @query := CONCAT("SELECT *, 
sqrt( 
     (POW(a.Latitude - co.CenterLatitude, 2)* 68.1 * 68.1) + 
     (POW(a.Longitude - co.CenterLongitude, 2) * 53.1 * 53.1) 
) AS distance 
FROM table1 as r 
JOIN table2 as co ON co.field1 = r.field2 
JOIN table3 AS a ON r.field1 = a.field2 
WHERE ",rid); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END 

Она имеет следующие прохождения через:

IN rid varchar(500), lat double, lon double 

Но мне нужно пройти в переменных широты и долготы. Я попытался установить их, а затем добавить их в запрос, но он не распознает их. Это то, что я пытаюсь сделать, не успешна:

BEGIN 
    SET @lat := lat; 
    SET @lon := lon; 
    SET @query := CONCAT("SELECT *, 
    sqrt( 
      (POW(a.Latitude - @lat, 2)* 68.1 * 68.1) + 
      (POW(a.Longitude - @lon, 2) * 53.1 * 53.1) 
    ) AS distance 
    FROM table1 as r 
    JOIN table2 as co ON co.field1 = r.field2 
    JOIN table3 AS a ON r.field1 = a.field2 
    WHERE ",rid); 

    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    END 

Я не уверен, как это сделать. У кого-нибудь есть предложения? Заранее спасибо!!

+0

не могли бы вы включить их в конкатенации, как вы делали 'rid'? – Uueerdo

+0

Не могли бы вы привести мне пример? – lov2code

ответ

3

Вы можете поместить в подготовленный оператор ? заполнители, а затем указать значения при его выполнении.

SET @query := CONCAT("SELECT *, 
sqrt( 
     (POW(a.Latitude - ?, 2)* 68.1 * 68.1) + 
     (POW(a.Longitude - ?, 2) * 53.1 * 53.1) 
) AS distance 
FROM table1 as r 
JOIN table2 as co ON co.field1 = r.field2 
JOIN table3 AS a ON r.field1 = a.field2 
WHERE ",rid); 
PREPARE stmt FROM @query; 
EXECUTE stmt USING @lat, @lon; 
+0

Я только что попробовал это, и время отклика примерно в 8 раз больше, чем было раньше, есть ли у вас какие-либо идеи, почему это может быть? – lov2code

+0

Спасибо, что ответив, кстати! – lov2code

+0

Выяснил это, большое вам спасибо! Работает как шарм :) – lov2code

1

ответ Barmar был бы моим предпочтительным решением, но, чтобы дать пример моему, что мой первоначальный комментарий предлагал ...

BEGIN 
SET @query := CONCAT("SELECT *, 
sqrt( 
     (POW(a.Latitude - ", lat, ", 2)* 68.1 * 68.1) + 
     (POW(a.Longitude - ", lon, ", 2) * 53.1 * 53.1) 
) AS distance 
FROM table1 as r 
JOIN table2 as co ON co.field1 = r.field2 
JOIN table3 AS a ON r.field1 = a.field2 
WHERE ",rid); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

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