
create proc Mypro
as
begin tran t1
declare @Myii int,@id int
begin
select @Myii=1
declare cur1 cursor for select id from 一个表
open cur1
fetch next from cur1 into @id
while(@@fetch_status=0)
begin
update 一个表 set 序号=@Myii where id=@id
select @Myii=@Myii+1
fetch next from cur1 into @id
end
close cur1
deallocate cur1
end
commit tran t1
--因为使用的游标,而你的数据量又大,可能执行的时间有点长
CREATE PROCEDURE PRO1()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(3);
DECLARE cur1 CURSOR FOR SELECT data FROM testdata1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
CASE FLOOR(1 + (RAND() 3))
WHEN 1 THEN INSERT INTO T_1 VALUES(a);
WHEN 2 THEN INSERT INTO T_2 VALUES(a);
WHEN 3 THEN INSERT INTO T_3 VALUES(a);
END;
UNTIL done END REPEAT;
CLOSE cur1;
END
(1)CONCAT()//字符连接
(2)CONCAT_WS()//使用指定的分隔符进行字符连接
(3)FORMAT()//数字格式化
(4)LOWER()//转化小写
(5)UPPER()//转换大写
(6)LEFT()//获取左侧字符
(7)RIGHT()//获取右侧字符
(8)LENGTH()//取得字符串长度
(9)LTRIM(),RTRIM(),TRIM()//删除前导、后续空格或者指定字符
(10)REPLACE()//替换
(11)SUBSTRING()//字符串截取
(12)[NOT] LIKE//模式匹配——百分号%代表任意个字符;下划线_代表任意一个字符
方案一: 存储过程
DROP PROCEDURE IF EXISTS SP_COLUMN_ADD;DELIMITER $$
CREATE PROCEDURE SP_COLUMN_ADD()
BEGIN
DECLARE command VARCHAR(200);
DECLARE founded INT DEFAULT 1;
DECLARE column_duplicated BOOLEAN DEFAULT FALSE;
#把这个游标的语句查下,是否满足需求
DECLARE cur_sleest CURSOR FOR
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' ADD COLUMN YOUR_COLUMN YOUR_TYPE;') AS SQL_COMMAND
#eg: `ALTER TABLE TMP_SLEEST ADD COLUMN C1 INT,ADD COLUMN C2 VARCHAR(2);`
FROM INFORMATION_SCHEMATABLES
WHERE TABLE_SCHEMA="yourschema"
AND TABLE_TYPE="BASE TABLE";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET founded = 0;
DECLARE CONTINUE HANDLER FOR 1060 SET column_duplicated = true;
OPEN cur_sleest;
sleet_loop : LOOP
FETCH cur_sleest INTO command;
IF founded = 0 THEN LEAVE sleet_loop; END IF;
SET @sql := command;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP sleet_loop;
CLOSE cur_sleest;
END$$
DELIMITER ;
方案二: 扫出指令集合到本地文件,贴到命令行执行
SELECT CONCAT("ALTER TABLE ", TABLE_NAME," ADD COLUMN YOUR_COLUMN YOUR_TYPE;")FROM INFORMATION_SCHEMATABLES
WHERE TABLE_SCHEMA="yourschema"
AND TABLE_TYPE="BASE TABLE"
INTO OUTFILE 'D:\\add-columnsql'
不推荐存储过程, 因为可能要处理1060(duplicated column)等问题, 存储过程不是很好弄,中间过程也不好跟踪, 不一定能查出哪里错了;
第二种方案直接在命令行中贴上,每一个句话正确错误一看就明了
DECLARE cur CURSOR FOR SELECT i FROM tablename;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ending = TRUE;
-- 打开游标
OPEN cur;
--使用游标代码
--关闭游标
CLOSE cur;
END
值得注意的一点是其中的declare顺序不可改变,即其他变量声明放在最前,游标及结束绑定的声明要放在后边,而且声明前不可有其他类型语句,否则会有符号错误。
游标使用的方法:
REPEAT
--游标储存一列
FETCH cur INTO a;
--游标储存多列
FETCH cur INTO a,b·····;
UNTIL ending
END REPEAT ;
关于结束标志:
结束标志是先通过一个FETCH INTO ,然后判断游标中是否还存在内容,如果没有内容就会执行 SET ending = TRUE; (定义代码中的),然后通过ending的判断即可跳出循环。
标签: mysql
好文要顶 关注我 收藏该文
不笨的鸟也要先飞
关注 - 4
粉丝 - 0
+加关注
0
0
« 上一篇:关于jq两个监听事件
» 下一篇:php发送邮件
posted @ 2016-03-07 23:44 不笨的鸟也要先飞 阅读(208) 评论(0) 编辑 收藏
以上就是关于mysql中如何使用存储过程为一个字段添加值全部的内容,包括:mysql中如何使用存储过程为一个字段添加值、mysql数据库存储过程问题,求大师指教、mysql存储过程在游标中怎么使用变量作为表明等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)