MySQL存储过程笔记

发布时间:2019-11-28编辑:脚本学堂
mysql的存储过程是mysql数据库的重点内容,本文从创建数据库、mysql存储过程管理等方面,对mysql存储过程做了详细的介绍,有需要的朋友参考下。
本节是 MySQL存储过程学习笔记分享 第二部分的内容。
2. repeat···· end repeat ;它在执行操作后检查结果,而while则是执行前进行检查
 

复制代码 代码示例:
  create procedure p15()
   begin
     declare v int;
     set v=0;
     repeat
       insert into t values(v);
       set v=v+1;
       until v>=5
     end repeat;
   end;//
 

3. loop ·····end loop; loop 循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环,
 

复制代码 代码示例:
create procedure p16()
   begin
      declare v int;
      set v=0;
      LOOP_LABLE:loop
         insert into t values(v);
  set v=v+1;
  if v >=5 then
     leave LOOP_LABLE;
  end if;
      end loop;
   end;//
 

4. LABLES 标号:标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
/***********  ITERATE迭代  *************/
1. ITERATE:通过引用复合语句的标号,来从新开始复合语句
 

复制代码 代码示例:
    create procedure p20()
      begin
        declare v int;
       set v=0;
      LOOP_LABLE:loop
      if v=3 then
          set v=v+1;
          ITERATE LOOP_LABLE;
       end if;
      insert into t values(v);
      set v=v+1;
      if v>=5 then
           leave LOOP_LABLE;
       end if;
      end loop;
      end;//
 

MySQL存储过程 ERROR Handler 异常处理
 问题样例:当insert失败时,我希望将其记录在日志文件中,在这里需要创建一个主键表,以及一个外键表,我们使用的是innodb ,因此外键关联检查是打开的,当我向外键表中插入非主键表中的值时,动作将会失败,创建的数据表如下:
 

复制代码 代码示例:
    create table t2(s1 int primary key)engine=innodb;//
   create table t3(s1 int,
                      key(s1),
                   foreign key (s1) references t2(s1))engine=innodb;//
    create table error_log(error_message char(80));//
 

1. 建立一个过程,第一个语句 DECLARE EXIT HANDLER是用来处理异常的,意思是如果错误 1216发生,这个程序将会在错误记录表中插入一行,EXIT的意思是 当动作成功提交后推出这个复合语句。
    

复制代码 代码示例:
create procedure p22(parameter int)
       begin
          declare exit Handler for 1452
     insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));
          insert into t3 values(parameter);
       end;//
 

2. 申明异常处理的语法 DECLARE HANDLER syntax:
       DECLARE {EXIT|continue} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement
   上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码,MYSQL允许两种处理器,一种是exit处理,另外一种是 continue处理,与exit
   不同的是在于他执行后,原主程序仍然继续运行,那么该复合语句就没有出口了。
 

复制代码 代码示例:
----continue处理的例子:
      create table t4(s1 int primary key);//
      create procedure p23()
       begin
         declare continue handler for SQLSTATE '23000' set @x2=1;
  set @x=1;
  insert into t4 values (1);
  set @x=2;
  insert into t4 values(1);
  set @x=3;
         select @x, @x2;
       end;//
       call p23();//
---- rollback(回滚事务),定义自己的错误处理名字 declare '错误处理名' condition for SQLSTATE'23000';
      create procedure p24()
       begin
         declare ViolationSelf condition for SQLSTATE'23000';
  DECLARE EXIT HANDLER for ViolationSelf rollback;
  start transaction;
  insert into t2 values(1);
         insert into t2 values(1);
  commit;
       end;//

/**************  Cursor游标  ****************************/
游标实现功能的摘要: 声明游标, 打开游标,从游标里读取,关闭游标
    

复制代码 代码示例:
  DECLARE cursor-name CURSOR FOR SELECT ······
      OPEN cursor-name;
      FETCH cursor-name INTO variable;
      CLOSE cursor-name;
 

1.

复制代码 代码示例:
create procedure p25(out return_val int)
    begin
      DECLARE a,b,c int;
      DECLARE cur_1 CURSOR for select s1 from t;
      DECLARE continue handler for not found set b=1;
       open cur_1;
       set c=0;
       repeat
         fetch cur_1 into a;
  until b=1
       end repeat;
       close cur_1;
       set return_val=a;
    end;//
 

2.  

复制代码 代码示例:
  create procedure p25_1(out return_val int)
    begin
      DECLARE a,b,c int;
      DECLARE cur_1 CURSOR for select s1 from t;
      DECLARE continue handler for not found set b=1;
       open cur_1;
       set c=0;
       lable_1:loop
         fetch cur_1 into a;
  if b=1 then
           leave lable_1;
  end if;
  set c=c+1;
       end loop;
       close cur_1;
       set return_val=c;
    end;//
    create procedure p34(in va int)
    begin
       delete from t where s1=va;
    end;//