Я создаю хранимую процедуру, которая будет выполнять подготовленную SELECT
на основе входных параметров. Нединамическая версия этой процедуры работает fine-, то есть, похоже, что работает основной запрос SELECT
. Когда я вызываю динамическую процедуру, я получаю синтаксическую ошибку в WHERE
. Я не понимаю, что случилось, и я просил еще один взгляд.
DROP PROCEDURE IF EXISTS find_batter;
DELIMITER //
CREATE PROCEDURE find_batter
( #input age, position, and parent org
IN age_param SMALLINT (6),
IN position_param VARCHAR (15),
IN org_param VARCHAR (10)
)
BEGIN
DECLARE select_clause VARCHAR (2000);
DECLARE where_clause VARCHAR (500);
DECLARE order_clause VARCHAR (200);
SET select_clause = "SELECT concat(p.first_name, ' ', p.last_name) as player
...
";
SET where_clause= "WHERE p.retired=0 AND b.year=2015 AND b.PA>50";
IF age_param IS NOT NULL THEN
SET where_clause = concat(where_clause, ‘ AND ‘, age_param, ‘>=p.age);
END IF;
...
Я получаю синтаксическую ошибку, сообщающую мне проверить около p.retired
в WHERE
. Остальные выражения IF интерпретируются как закодированные - динамические, где в ошибке появляются сообщения, поэтому я думаю, что проблема заключается в первом SET
. Я просто этого не вижу.
РЕДАКТИРОВАТЬ: Вопрос не был до "ГДЕ".
То, что я вижу в коде, - это фанковые умные кавычки Windowz в коде.
SET where_clause = concat(where_clause, ‘ AND ‘, age_param, ‘>=p.age);
-- ^ ^ ^ ^
В качестве первого шага я предлагаю заменить кавычки фанки на простые персонажи с одинарными кавычками vanii ascii 39 (0x27).
SET where_clause = concat(where_clause, ' AND ', age_param, '>=p.age');
-- ^ ^ ^ ^