文章目录
问题
数据库表描述
发生问题的存储过程写法
Navicat调用结果
SQL语句直接调用
预编译表达式调用
修改后的存储过程
问题
由于在项目中需要在多个同样格式表中,查询同一条件结果。为此编写了一个存储过程,通过游标的方式获取指定命名格式的表名。然后编写动态SQL语句分别查询每个表,再使用UNION ALL合并结果一次性返回。通过Navicat工具调用存储过程可以正常获得结果,在C API直接通过SQL语句也可以直接查询,但通过预编译表达式的方法调用,则提示MYSQL_NO_DATA没有对应的结果。
MySQL版本 5.6.37 (x64)
数据库表描述
在数据库test中,有两张表分别为personlist1、personlist2,表的内容分别为:
发生问题的存储过程写法
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调用结果