SQL储存过程

SQL储存过程_第1张图片
1.游标

游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中,它们使结果集的内容可用于其它T_SQL语句。在查看或处理结果集中向前或向后浏览数据的功能。类似与C语言中的指针,它可以指向结果集中的任意位置,当要对结果集进行逐条单独处理时,必须声明一个指向该结果集中的游标变量。
SQL Server 中的数据操作结果都是面向集合的,并没有一种描述表中单一记录的表达形式,除非使用WHERE子句限定查询结果,使用游标可以提供这种功能,并且游标的使用和操作过程更加灵活、高效。
SELECT 语句返回的是一个结果集,但有时候应用程序并不总是能对整个结果集进行有效地处理,游标便提供了这样一种机制,它能从包括多条记录的结果集中每次提取一条记录,游标总是与一条SQL选择语句相关联,由结果集和指向特定记录的游标位置组成。使用游标具有一下优点:
(1).允许程序对由SELECT查询语句返回的行集中的每一次执行相同或不同的操作,而不是对整个集合执行同一个操作。
(2).提供对基于游标位置中的行进行删除和更新的能力。
(3).游标作为数据库管理系统和应用程序设计之间的桥梁,将两种处理方式连接起来。
2.declare continue handler for sqlstate ‘02000’ set done=1;

经常在定义cursor的时候都会定义cursor未找到(NOT FOUND或SQLSTATE ‘02000’)的条件来标识游标结束。
02000 主要代表的意思可以理解为:
发生下述异常之一:
SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。
在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。
在 FETCH 语句中引用的游标位置处于结果表最后一行之后。
就是说你定义了,当fetch游标到了数据库表格最后一行的时候,设置done=1.
3.一个简单的循环

begin
    declare i int;
    set i=0;
    while i<1000 do
    insert into qq_num(num,name) values(i,'麻花疼');
    set i=i+1;
    end while;
 end

简单的一个while循环
4.复杂循环

BEGIN

DECLARE _companyid varchar(32);
DECLARE _start_time        char(10);
DECLARE _end_time        	char(10);
DECLARE _done int default 0;
DECLARE _done2 int default 0;

	BEGIN
		DECLARE _Cur CURSOR FOR select o.id from sys_office o where o.del_flag = '0' and o.`type` = '2';
		DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done = 1;
		OPEN _Cur;
			REPEAT
			FETCH _Cur INTO _companyid;
			IF _done <> 1
			THEN
				
				SET _done2 = 0;
				BEGIN
					DECLARE _Cur2 CURSOR FOR select distinct a.study_start_time,a.study_end_time from cms_class_schedule a where a.del_flag = 0 and a.company_id = _companyid;
					DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done2 = 1;
					OPEN _Cur2;
						REPEAT
						FETCH _Cur2 INTO _start_time,_end_time;
						IF _done2 <> 1
						THEN
							insert ignore into cms_schedule_time(id,company_id,start_time,end_time,up_or_down,create_by,create_date,del_flag) values(REPLACE(UUID(),"-",""),_companyid,_start_time,_end_time,'0','1',now(),'0');
						END IF;
						UNTIL _done2 END REPEAT;
					CLOSE _Cur2;
				END;
			
			END IF;
			UNTIL _done END REPEAT;
		CLOSE _Cur;
	
	END;
	
END

你可能感兴趣的:(mysql)