MySQL存储过程实现动态执行SQL
2023-09-11 14:19:35 时间
--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数 create procedure p_procedurecode(in sumdate varchar(10)) begin declare v_sql varchar(500); --需要执行的SQL语句 declare sym varchar(6); declare var1 varchar(20); declare var2 varchar(70); declare var3 integer; --定义游标遍历时,作为判断是否遍历完全部记录的标记 declare no_more_departments integer DEFAULT 0; --定义游标名字为C_RESULT DECLARE C_RESULT CURSOR FOR SELECT barcode,barname,barnum FROM tmp_table; --声明当游标遍历完全部记录后将标志变量置成某个值 DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1; set sym=substring(sumdate,1,6); --截取字符串,并将其赋值给一个遍历 --连接字符串构成完整SQL语句,动态SQL执行后的结果记录集,在MySQL中无法获取,因此需要转变思路将其放置到一个临时表中(注意代码中的写法)。一般写法如下: -- 'Create TEMPORARY Table 表名(Select的查询语句); set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)'); set @v_sql=v_sql; --注意很重要,将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头) prepare stmt from @v_sql; --预处理需要执行的动态SQL,其中stmt是一个变量 EXECUTE stmt; --执行SQL语句 deallocate prepare stmt; --释放掉预处理段 OPEN C_RESULT; --打开之前定义的游标 REPEAT --循环语句的关键词 FETCH C_RESULT INTO VAR1, VAR2, VAR3; --取出每条记录并赋值给相关变量,注意顺序 --执行查询语句,并将获得的值付给一个变量 @oldaacode(注意如果以@开头的变量可以不用通过declare语句事先声明) select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate; if @oldaacode=var1 then --判断 update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate; else insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate); end if; UNTIL no_more_departments END REPEAT; --循环语句结束 CLOSE C_RESULT; --关闭游标 DROP TEMPORARY TABLE tmp_table; --删除临时表 end;
相关文章
- 有趣的 Mysql 存储引擎
- PHP MySQL Update
- 【MySQL高级】Mysql并发参数调整及常用SQL技巧
- mysql存储过程
- MySQL修改存储过程(ALTER PROCEDURE)/删除存储过程(DROP PROCEDURE)
- 【mysql】MySQL的sql_mode模式说明及设置
- Mysql查询缓存Query_cache的功用
- sql: MySQL and Microsoft SQL Server Stored Procedures IN, OUT using csharp code
- 基于easyexcel的MySQL百万级别数据的excel导出功能
- MySql存储过程与函数详解
- MySQL存储过程详解 mysql 存储过程
- mysql—MySQL数据库中10位或13位时间戳和标准时间相互转换
- Mysql中的存储过程
- Amoeba for MySQL 非常好用的mysql集群软件
- sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)
- 【3.3】mysql链接服务器,Federated存储引擎实现远程表,相当于sql server的连接服务器
- (5.4)mysql高可用系列——MySQL异步复制(实践)
- MySQL的not exists与双重否定(模板)
- 猫眼电影爬取(二):requests+beautifulsoup,并将数据存储到mysql数据库
- 【数据库】MySQL概念知识语法-基础篇-事务,真的很详细,一篇文章你就会了
- Mac - Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储
- 【曹工杂谈】Mysql-Connector-Java时区问题的一点理解--写入数据库的时间总是晚13小时问题
- php 之mysql安全