变量

时间:2018-04-10 18:14:10

标签: mysql

我正在创建一个存储过程,该存储过程将根据输入参数执行准备好的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"。

之前没有空间

1 个答案:

答案 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');
--                                      ^     ^             ^       ^