You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:29:55