SingleStore存储过程传入变量表名执行失败问题
SingleStore存储过程动态传表名报错解决方案
报错原因
拼接动态SQL时多添加了分号,导致EXECUTE IMMEDIATE将执行内容解析为两个语句:SELECT COUNT(*) FROM myTbl和一个空语句,而SingleStore不允许存储过程中存在非ECHO类型的SELECT语句(空语句触发了该限制)。此外,直接拼接表名存在SQL注入风险。
修正后的代码
DELIMITER // CREATE OR REPLACE PROCEDURE tmp_into_var ( srcTbl VARCHAR(128) ) AS DECLARE row_c INT; qry VARCHAR(200); -- 扩大字符串长度避免截断 BEGIN -- 用QUOTENAME包裹表名,防范SQL注入并兼容特殊表名 qry = CONCAT('SELECT COUNT(*) FROM ', QUOTENAME(srcTbl)); EXECUTE IMMEDIATE qry INTO row_c; ECHO SELECT row_c AS "Row Count"; END // DELIMITER ; CALL tmp_into_var('myTbl');
核心修改点
- 移除动态SQL末尾的分号:
EXECUTE IMMEDIATE执行的SQL语句无需加分号,否则会被解析为多语句触发限制。 - 使用
QUOTENAME处理表名:自动为表名添加反引号,既避免SQL注入风险,又能兼容包含特殊字符或关键字的表名。 - 扩大字符串变量长度:原
VARCHAR(50)可能不足以容纳完整SQL,改为VARCHAR(200)更稳妥。
内容的提问来源于stack exchange,提问作者swateek
相关产品推荐
相关产品推荐

