mysql 存储过程游标删除_mysql数据库存储过程游标循环,提前退出
需求:向trade這個數(shù)據庫中的每一個表增加多個字段
遇到問題:存儲過程,游標,循環(huán),動態(tài)sql執(zhí)行
注意:
mysql 存儲過程在我所使用的5.5版本中不能使用 show 的命令,利用
information_schema 獲得表的相關信息。
游標循環(huán)中出現(xiàn) select into 賦值 為 null 的時候,循環(huán)會 提前退出,解決方法有三種
不用select into
select aa into bb,aa改為count(aa),之后的代碼由判斷null改為判斷0
當賦值結果為null的時候,會自動修改循環(huán)觸底的標志,所以手動在循環(huán)底部增加 ?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 存储过程游标删除_mysql数据库存储过程游标循环,提前退出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO如何强行安装应用(oppo如何强
- 下一篇: mysql删除数据不会减少存储占用_My