需求:向trade这个数据库中的每一个表增加多个字段
遇到问题:存储过程,游标,循环,动态sql执行
注意:
mysql存储过程在我所使用的5.5版本中不能使用 show 的命令,利用 information_schema 获得表的相关信息。
游标循环中出现 select into 赋值 为 null 的时候,循环会 提前退出,解决方法有三种
- 不用select into
- select aa into bb,aa改为count(aa),之后的代码由判断null改为判断0
- 当赋值结果为null的时候,会自动修改循环触底的标志,所以手动在循环底部增加 set b = 1;
-- Procedure "useCursor" DDL drop PROCEDURE if exists useCursor; CREATE PROCEDURE `useCursor`() BEGIN /*局部变量的定义 declare*/ declare temp_table_name varchar(100) default ''; declare temp varchar(100); declare b int default 0; /*是否达到记录的末尾控制变量*/ declare cur CURSOR FOR (SELECT table_name from information_schema.`TABLES` where TABLE_SCHEMA = 'trade'); DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; /*开游标*/ OPEN cur; /*游标向下走一步,将查询出来的两个值付给定义的两个变量*/ FETCH cur INTO temp_table_name; WHILE ( b<>1 ) DO #1 SELECT COLUMN_NAME into temp from information_schema.`COLUMNS` where TABLE_SCHEMA = 'trade' and table_name = temp_table_name and COLUMN_NAME = 'bb'; if temp is null then set @sql = concat('alter table ', temp_table_name); set @sql = concat(@sql, ' add bb varchar(50);' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; end if; #2 SELECT COLUMN_NAME into temp from information_schema.`COLUMNS` where TABLE_SCHEMA = 'trade' and table_name = temp_table_name and COLUMN_NAME = 'ww'; if temp is null then set @sql = concat('alter table ', temp_table_name); set @sql = concat(@sql, ' add ww varchar(50);' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; end if; #3 SELECT COLUMN_NAME into temp from information_schema.`COLUMNS` where TABLE_SCHEMA = 'trade' and table_name = temp_table_name and COLUMN_NAME = 'ff'; if temp is null then set @sql = concat('alter table ', temp_table_name); set @sql = concat(@sql, ' add ff varchar(50);' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; end if; #4 SELECT COLUMN_NAME into temp from information_schema.`COLUMNS` where TABLE_SCHEMA = 'trade' and table_name = temp_table_name and COLUMN_NAME = 'pp'; if temp is null then set @sql = concat('alter table ', temp_table_name); set @sql = concat(@sql, ' add pp varchar(50);' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; end if; /*游标向下走一步*/ set b = 0; FETCH cur INTO temp_table_name; END WHILE; CLOSE cur; END; call useCursor; drop PROCEDURE if exists useCursor;
相关推荐
Mysql游标(循环操作)
Oracle数据库添加 更新 游标 过程 Java Project Oracle数据库添加 更新 游标 过程 Java Project
Mysql存储过程游标触发器
最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1....
MySql存储过程,游标的使用方法,速度极快!
1、什么是游标? 一张图讲述游标的功能: ... 首先,使用pymysql连接上mysql数据库,得到一个数据库对象。 然后,我们必须要开启数据库中的游标功能,得到一个游标对象。 接着,使用游标对象中的execute
TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储...
MYSQL数据库的索引、视图、触发器、游标和存储过程
数据库系统原理与设计 实验教程 之游标 实验游标答案
今天分享下自己对于Mysql存储过程的认识与了解,这里主要说说大家常用的游标加循环的嵌套使用
Oracle存储过程游标详解,针对Oracle存储过程游标详细说明。
本节主要介绍了Mysql存储过程循环内如何嵌套使用游标,详细实现如下,需要的朋友不要错过
MySQL 存储过程与游标的混合使用,也没啥重要的,就是和其他数据库有一些不同而已,作为总结,以后复习
SqlServer存储过程游标 ,一个例子
使用存储过程是想循环insert 数据库中查询出来的复杂结果集
实验八数据库编程技术——游标、存储过程与触发器.pdf
本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。
讲有关java如何调用ORACLE存储过程以及游标使用,它只包含JAVA调用ORACLE存储过程游标使用(上),还有JAVA调用ORACLE存储过程游标使用(上),