我正在创建一个存储过程,该存储过程将根据输入参数执行准备好的SELECT
语句。此过程的非动态版本工作正常 - 也就是说,基础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语句都是经过编码的 - 动态where语句出现在错误中,因此我认为问题出在第一个SET
语句中。我只是没有看到它。
编辑:问题是在#34; WHERE"。
之前没有空间答案 0 :(得分:0)
我在代码中看到的是代码中的时髦Windowz风格的智能引号。
SET where_clause = concat(where_clause, ‘ AND ‘, age_param, ‘>=p.age’);
-- ^ ^ ^ ^
作为第一步,我建议用简单的香草ascii 39(0x27)单引号字符替换质朴的引号。
SET where_clause = concat(where_clause, ' AND ', age_param, '>=p.age');
-- ^ ^ ^ ^