百度
360搜索
搜狗搜索

mysql存储过程循环语句,mysql循环添加数据详细介绍

本文目录一览: 详解MySQL如何实现创建存储过程并循环添加记录的方法

这篇文章主要介绍了MySQL实现创建存储过程并循环添加记录的方法,涉及基本的mysql存储过程创建、调用相关操作技巧,需要的朋友可以参考下本文实例讲述了MySQL实现创建存储过程并循环添加记录的方法。分享给大家供大家参考,具体如下:先创建,然后调用:-- 创建存储过程DELIMITER;//create procedure myproc()begindeclare num int;set num=1;while num <= 24 doinsert into t_calendar_hour(hourlist) values(num);set num=num+1;end while;commit;end;//-- 调用存储过程CALL myproc();

五、MYSQL存储过程和函数

? create procedure用来创建 存储过程 ,create function用来创建 函数

? Delimiter命令是改变语句的结束符 ,MySQL默认的结束符为;号,由于procedure和function中的;号并不代表创建的结束,所以要替换成另外的结束符以便表示创建的结束 ? rontine_body子句可以包含一个简单的SQL语句,也可以包含多个SQL语句, 通过begin…end将这多个SQL语句 包含在一起 ? MySQL存储过程和函数中也可以包含类似create和drop等DDL语句 ? comment子句用来写入对存储过程和函数的注释 ? Language子句用来表示此存储过程和函数的创建语言 ? 存储过程和函数被标注为deterministic表明当输入相同的参数是会返回相同的结果,反之如果是not deterministic则表示相同参数不会是相同结果,默认是not deterministic
? 相关属性短语只有咨询含义,并不是强制性的约束
? Drop procedure/function语句用来 删除指定名称的存储过程或函数

? Begin…end语句通常出现在存储过程、函数和触发器中,其中 可以包含一个或多个语句 ,每个语句用;号隔开

? 标签label可以加在begin…end语句以及loop, repeat和while语句 ? 语句中通过iterate和leave来控制流程,iterate表示返回指定标签位置,leave表示跳出标签

? Declare语句通常用来声明本地变量、游标、条件或者handler ? Declare语句只允许出现在begin … end语句中而且必须出现在第一行 ? Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler
? 本地变量可以通过declare语句进行声明 ? 声明后的变量可以通过select … into var_list进行赋值,或者通过set语句赋值,或者通过定义游标并使用fetch … into var_list赋值 ? 通过declare声明变量方法:

? MySQL支持if,case,iterate,leave,loop,while,repeat语句作为存储过程和函数中的 流程控制语句 ,另外return语句也是函数中的特定流程控制语句
? Case语句在存储过程或函数中表明了 复杂的条件选择语句

? IF语句在存储过程或函数中表明了 基础的条件选择语句

其中在 function 里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的 function 指定一个参数。 在 MySQL 中创建函数时出现这种错误的解决方法: set global log_bin_trust_function_creators=TRUE;
? Iterate语句 仅出现在loop,repeat,while循环语句中,其含义表示重新开始此循环

? Leave语句表明 退出指定标签的流程控制语句块 ? 通常会用在begin…end,以及loop,repeat,while的循环语句中

? Loop语句是存储过程或函数中表达 循环执行 的一种方式

? repeat语句是存储过程或函数中表达 循环执行 的一种方式

? while语句是存储过程或函数中表达 循环执行 的一种方式

? Return语句用在 函数中,用来终结函数的执行并将指定值返回给调用者

? Cursor游标用来 声明一个数据集 ? 游标的声明必须在变量和条件声明之后,在handler声明之前
? Cursor close语句用来 关闭之前打开的游标

? Cursor declare语句用来声明一个游标和指定游标对应的数据集合, 通常数据集合是一个select语句

? Cursor fetch语句用来获取游标指定数据集的 下一行数据 并将各个字段值赋予后面的变量

? Open cursor语句用来打开一个之前已经 声明好的游标

? Declare condition语句命名 特定的错误条件 ,而该特定错误可以在declare…handler中指定 处理方法

? 比如在MySQL中1051error code表示的是unknown table的错误,如果要对这 个错误做特殊处理,可以用三种方法:
? Declare handler语句用来声明一个handler来处理一个或多个特殊条件,当其中的某个条件满足时则触发其中的statement语句执行 ? Statement可以是一个简单SQL语句,也可以是begin…end组成的多个语句
? Handler_action子句声明当执行完statement语句之后应该怎么办
Condition_value的值有以下几种:
? 当condition发生但没有声明handler时,则存储过程和函数依照如下规则处理
? create trigger语句用来创建一个触发器,触发器的作用是当表上有对应SQL语句发生时,则触发执行 ? 触发器创建时需要 指定对应的表名 tbl_name
? Definer关键词用来指定trigger的安全环境 ? Trigger_time指定触发器的执行时间,BEFORE和AFTER指定触发器在表中的 每行数据修改前或者后 执行 ? Trigger_event指定触发该触发器的具体 事件 ? INSERT当新的一行数据插入表中时触发,比如通过执行insert,load data,replace语句插入新数据 ? UPDATE当表的一行数据被修改时触发,比如执行update语句时 ? DELETE当表的一行数据被删除时触发,比如执行delete,replace语句时 ? 当执行insert into … on duplicate key update语句时,当碰到重复行执行update时,则触发update下的触发器 ? 从5.7.2版本开始,可以创建具有相同trigger_time和trigger_event的同一个表上的多个触发器,默认情况下按照创建的时间依次执行,通过 指定FOLLOWS/PRECEDES改变执行顺序 ,即FOLLOWS时表示新创建的触发器后执行,PRECEDES则表示新触发器先执行 ? Trigger_body表示触发器触发之后要执行的一个或多个语句,在内部可以引用涉及表的字段, OLD.col_name表示行数据被修改或删除之前的字段数据,NEW.col_name表示行数据被插入或修改之后的字段数据
? Drop trigger语句用来 删除一个触发器
? If exists短语用来避免删除不存在的触发器时引发报错 ? 当你执行drop table时,表上的触发器也被drop掉了

mysql存储过程中iterate对while起不起效果

在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了。
这几个循环语句的格式如下:
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
GOTO。

下面首先使用第一种循环编写一个例子。
mysql> create procedure pro10()
-> begin
-> declare i int;
-> set i=0;
-> while i<5 do
-> insert into t1(filed) values(i);
-> set i=i+1;
-> end while;
-> end;//
Query OK, 0 rows affected (0.00 sec)
在这个例子中,INSERT和SET语句在WHILE和END WHILE之间,当变量i大于等于5的时候就退出循环。使用set i=0;语句是为了防止一个常见的错误,如果没有初始化,i默认变量值为NULL,而NULL和任何值操作的结果都是NULL。
执行一下这个存储过程并产看一下执行结果:
mysql> delete from t1//
Query OK, 0 rows affected (0.00 sec)
mysql> call pro10()//
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
以上就是执行结果,有5行数据插入到数据库中,证明存储过程编写正确无误^_^。
再来看一下第二个循环控制指令 REPEAT……END REPEAT。使用REPEAT循环控制语句编写下面这个存储过程:
mysql> create procedure pro11()
-> begin
-> declare i int default 0;
-> repeat
-> insert into t1(filed) values(i);
-> set i=i+1;
-> until i>=5
-> end repeat;
-> end;//
Query OK, 0 rows affected (0.00 sec)
这个REPEAT循环的功能和前面WHILE循环一样,区别在于它的执行后检查是否满足循环条件(until i>=5),而WHILE则是执行前检查(while i<5 do)。
不过要注意until i>=5后面不要加分号,如果加分号,就是提示语法错误。
编写完成后,调用一下这个存储过程,并查看结果:
mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)
mysql> call pro11()//
Query OK, 1 row affected (0.00 sec) #虽然在这里显示只有一行数据受到影响,但是下面选择数据的话,还是插入了5行数据。
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
一行就是执行结果,实际的作用和使用while编写的存储过程一样,都是插入5行数据。
再来看一下第三个循环控制语句LOOP……END LOOP。编写一个存储过程程序如下:
mysql> create procedure pro12()
-> begin
-> declare i int default 0;
-> loop_label: loop

阅读更多 >>>  mysql索引分为哪六种,mysql索引类型有哪些

-> insert into t1(filed) values(i);
-> set i=i+1;
-> if i>=5 then
-> leave loop_label;
-> end if;
-> end loop;
-> end;//
Query OK, 0 rows affected (0.00 sec)
从上面这个例子可以看出,使用LOOP编写同样的循环控制语句要比使用while和repeat编写的要复杂一些:在循环内部加入了IF……END IF语句,在IF语句中又加入了LEAVE语句,LEAVE语句的意思是离开循环,LEAVE的格式是:LEAVE 循环标号。
编写完存储过程程序后,来执行并查看一下运行结果:
mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)

mysql循环添加数据

已经测试,创建并运行下面的存储过程可以循环添加数据:
create procedure dowhile()
begin
declare i int default 0;
start transaction;
while i<50 do
insert into users(userId,userName,userPwd) values(null,concat('s00',i),123456);
set i=i+1;
end while;
commit;
end;
delimiter;

mysql存储过程里怎么循环一张表

给你一个 参考
--存储过程名和参数,参数中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存储过程游标循环用哪种比较好

如果没有则插入数据,如果有则更新的方法:
insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;
[sql] view plain copy
CREATE PROCEDURE `test`.`new_procedure` ()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE a CHAR(16);
-- 游标
DECLARE cur CURSOR FOR SELECT i FROM test.t;
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur;

阅读更多 >>>  构成存储器的最小单位是什么

-- 开始循环
read_loop: LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO a;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 这里做你想做的循环的事件

INSERT INTO test.t VALUES (a);

END LOOP;
-- 关闭游标
CLOSE cur;

END
实例2
[sql] view plain copy
BEGIN
DECLARE Done INT DEFAULT 0;

DECLARE CurrentLingQi INT;

DECLARE ShizuName VARCHAR(30);
/* 声明游标 */
DECLARE rs CURSOR FOR SELECT NodeName, LingQi FROM socialrelation;
/* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;

/* 打开游标 */
OPEN rs;

/* 逐个取出当前记录LingQi字段的值,需要进行最大值的判断 */
FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
/* 遍历数据表 */
REPEAT
IF NOT Done THEN
SET CurrentLingQi = CurrentLingQi + 60;
/* 如果更新后灵气值大于允许的最大值,则就设置为最大值 */
IF CurrentLingQi >= 1800 THEN
UPDATE socialrelation SET LingQi = 1800 WHERE NodeName = ShizuName;
ELSE
/* 否则,正常更新 */
UPDATE socialrelation SET LingQi = LingQi + 60 WHERE NodeName = ShizuName;
END IF;
END IF;

FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;

UNTIL Done END REPEAT;

/* 关闭游标 */
CLOSE rs;
END

mysql存储过程需要循环前台传来的参数然后循环插入表

delimit $
CREATE PROCEDURE simpleproc (seq INT,farmer varchar(50),num INT)
BEGIN
declare i int;
set i=1;
while i<=300 do
insert inot table values(seq,farmer);
set i=i+1;
end while;
END $

mysql存储过程中分支语句有哪些

存储过程:
create procedure p()
begin
/*thi procedure does nothing*/
end;
1.参数
Parameters 参数
让我们更进一步的研究怎么在存储过程中定义参数1. CREATE PROCEDURE p5
() ...
2. CREATE PROCEDURE p5
([IN] name data-type) ...
3. CREATE PROCEDURE p5
(OUT name data-type) ...
4. CREATE PROCEDURE p5
(INOUT name data-type) ...
2.Conditions and if-then-else 条件式和 if-then-else
3.Loops 循环语句
WHILE ... END WHILE
LOOP ... END LOOP
REPEAT ... END REPEAT
GOTO
4.DECLARE HANDLER syntax 声明异常处理的语法
DECLARE
{ EXIT | CONTINUE }
HANDLER FOR
{ error-number | { SQLSTATE error-string } | condition }
SQL statement
5.Cursors 游标
游标实现功能摘要:
DECLARE cursor-name CURSOR FOR SELECT ...;
OPEN cursor-name;
FETCH cursor-name INTO variable [, variable];
CLOSE cursor-name;
已现经在可我以们完开成始基着本眼的游事标了务如。声虽明然游我标们,的打存开储游过标程,中从的游游标标里语法读取还,并关没闭有完游整标。
6.Functions 函数
Summary:
摘要 CREATE FUNCTION
Limitations of functions
函数的限制
我们已经很清楚可以在存储过程中使用的元素了。下面我要讲的是前面没有提到的函数。

阅读更多 >>>  linux用命令登mysql

mysql存储过程中怎么在循环中取变量值???

CREATE PROCEDURE LOOPINSERT()
BEGIN
DECLARE V_I INT DEFAULT 0;
START TRANSACTION;
WHILE V_I<=5 DO
SET V_I=V_I+1;
SET @V=V_I;
SET @INSERTSTR=CONCAT('INSERT INTO TB_LOG(ID) VALUES(?)');
PREPARE STMT FROM @INSERTSTR;
EXECUTE STMT USING @V;
END WHILE;
DEALLOCATE PREPARE STMT;
COMMIT;
END;
与以上代码类似

网站数据信息

"mysql存储过程循环语句,mysql循环添加数据"浏览人数已经达到19次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:mysql存储过程循环语句,mysql循环添加数据的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!