MySQL存储过程预处理语句用变量作LIMIT、排序参数报1064错如何解决
MySQL存储过程预处理分页查询1064错误解决方案
错误根源
你遇到的1064错误和LIMIT子句无关,核心原因是:
- 预处理语句的
?占位符仅支持传入值类型参数,无法替代SQL语法关键字、标识符这类结构类内容。你代码里的排序方向ASC/DESC属于SQL语法成分,用?传递时会被自动加上值引号,生成ORDER BY price 'ASC'的非法语法,直接触发报错。 - 你原代码中
AGAINST子句内直接写的存储过程参数MainSubcategory在预处理语句的作用域中无法识别,也会导致后续执行异常。
解决方案
排序方向不要使用?占位符,直接把提前判断好的排序规则拼接进预处理SQL字符串即可,其余值类参数还是保留?占位符传递。LIMIT的偏移量、每页条数参数本身就支持用?传值,无需调整。
修正后完整代码
DELIMITER // -- 创建商品分页查询存储过程 CREATE PROCEDURE GetProductsList(MainSubcategory VARCHAR(500), SubcategoryChildName VARCHAR(500), OffsetVal INT, NumberOfRecordPerPage INT, orderLowToHigh Boolean) READS SQL DATA BEGIN SET @MainSubcategory = MainSubcategory; SET @SubcategoryChildName = SubcategoryChildName; -- 确定排序方向 IF orderLowToHigh = true THEN SET @SortOrder = 'ASC'; ELSE SET @SortOrder = 'DESC'; END IF; SET @OffsetVal = OffsetVal; SET @NumberOfRecordPerPage = NumberOfRecordPerPage; -- 拼接预处理SQL,排序方向直接拼入字符串 SET @mainQuerySql = CONCAT("SELECT title, product_category_tree, id, images, price, old_price FROM PRODUCTS WHERE MATCH(product_category_tree) AGAINST (? IN NATURAL LANGUAGE MODE) AND product_category_tree LIKE CONCAT('%',?,' >> ',?,'%') ORDER BY price ", @SortOrder, " LIMIT ?, ?;"); PREPARE mainQuery FROM @mainQuerySql; -- 按顺序传递对应参数 EXECUTE mainQuery USING @MainSubcategory, @MainSubcategory, @SubcategoryChildName, @OffsetVal, @NumberOfRecordPerPage; DEALLOCATE PREPARE mainQuery; END// DELIMITER ;
内容的提问来源于stack exchange,提问作者MoBal
相关产品推荐
相关产品推荐

