mysql 预编译绑定游标_C API预编译调用MySQL带游标存储过程出现MYSQL_NO_DATA

在C API中使用预编译表达式调用带有游标的MySQL存储过程时遇到MYSQL_NO_DATA错误。通过调整存储过程的结构,使用临时表解决该问题,成功避免SQL注入并获取正确结果。
摘要由CSDN通过智能技术生成

文章目录

问题

数据库表描述

发生问题的存储过程写法

Navicat调用结果

SQL语句直接调用

预编译表达式调用

修改后的存储过程

问题

由于在项目中需要在多个同样格式表中,查询同一条件结果。为此编写了一个存储过程,通过游标的方式获取指定命名格式的表名。然后编写动态SQL语句分别查询每个表,再使用UNION ALL合并结果一次性返回。通过Navicat工具调用存储过程可以正常获得结果,在C API直接通过SQL语句也可以直接查询,但通过预编译表达式的方法调用,则提示MYSQL_NO_DATA没有对应的结果。

MySQL版本 5.6.37 (x64)

数据库表描述

在数据库test中,有两张表分别为personlist1、personlist2,表的内容分别为:

22591d7fedcdd59e7052f0af5d6f8806.png

3740ef7e41e6d883469fe71def985050.png

发生问题的存储过程写法

CREATE DEFINER=`root`@`localhost` PROCEDURE `QueryAllZhang`()

BEGIN

DECLARE stopflag INT DEFAULT 0;

DECLARE tablename varchar(255);

DECLARE SqlSelectResult varchar(1024) DEFAULT("");

DECLARE cur CURSOR FOR select table_name from information_schema.tables where table_name like "personlist%";

DECLARE CONTINUE HANDLER FOR not found SET stopflag = 1 ;

OPEN cur;

FETCH cur into tablename;

if stopflag = 0 then

SET SqlSelectResult = CONCAT("select name from ",tablename," where name like 'zhang%'");

FETCH cur into tablename;

end if;

while stopflag = 0 Do

SET SqlSelectResult = CONCAT(SqlSelectResult," UNION ALL select name from ",tablename," where name like 'zhang%'");

FETCH cur into tablename;

end WHILE;

close cur;

SET SqlSelectResult = CONCAT("",SqlSelectResult,";");

set @sql = SqlSelectResult;

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE prepare stmt;

END

Navicat调用结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值