存储过程(1)----开篇

这几天觉得自己要研究一下存储过程,因为觉得自己数据库这块,自己也要加强一下

接下介绍自己的心得,oracle和mysql的都看过了一些,先从简单都起步

建立一个简单都存储过程

DROP PROCEDURE IF EXISTS `stu_insert`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert`()
BEGIN
      declare i int;
	 declare m varchar(20);
     set i=21;
     repeat 
		 set m ='wm';
		 set m = concat(m ,  i);
         insert into Student(id,name,address,desction,age,createTime) values(i,m,m,m,i,now());
         set i=i+1;
		until i>23
     end repeat;
  
END
;;
DELIMITER ;

第一句话,建表是不是很常见。存储过程也是存放在一个地方都,这个地方oracle叫做procedures文件下,而mysql是在函数下面。

判断下stu_insert这个表是否存在,存在就drop。

DELIMITER oracle有没有我不知道,mysql 是告诉mysql 我要用;;来结束一个存储过程,因为mysql遇见;这个就结束,开始执行这个语句,所以要改掉结束语句都标志符当然DELIMITER后面都符号你可以自己定义,;;或这$$都是可以的,也是比较常见的

当然最后要把定义的结束语;;改为; 不然接下来的运行的sql都会以;;为结尾

create 是创建 ,DEFINER是指明存储过程是由哪个用户定义的

PROCEDURE 是建立的存储过程的名称

BEGIN 和END是存储过程的开始和结束

declare这个定义用的,变量加一个这个

set一看功能就知道他是一个赋值功能

concat 一个string和string拼接或string和int拼接就用到这个函数:如 m="hha"+123  >> m="hha123"

1.repeat进入循环,until处理循环到跳出机制,当不满足条件就跳出循环


DROP PROCEDURE IF EXISTS `stu_insert`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert`()
BEGIN
    #Routine body goes here...
     declare i int;
     set i=0;
     while i<5 do
         insert into Student(id,name,address,desction,age,createTime) values(i,'wm1','wm1','wm1',i,now());
         set i=i+1;
     end while;
  
END
;;
DELIMITER ;

2. while do循环,当不满足跳出循环


DROP PROCEDURE IF EXISTS `stu_insert3`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert3`()
BEGIN
    #Routine body goes here...
     declare i int;
	 declare m varchar(20);
     set i=21;
     wmdahshuaige:loop 
		 set m ='wm';
		 set m = concat(m ,  i);
         insert into Student(id,name,address,desction,age,createTime) values(i,m,m,m,i,now());
         set i=i+1;
		 if i>=5 then
            leave wmdahshuaige;
         end if;
       end loop;
  
END
;;
DELIMITER ;

3.loop循环:先随便定义一个loop当名称,我这里定义的是 wmdahshuaige ,然后我们选择在这该loop里用一个if条件来判断是否离开循环

leave+自己定义的loop名称,就是脱离循环



DROP PROCEDURE IF EXISTS `stu_insert4`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert4`() -- 创建存储过程  
begin -- 开始存储过程  
declare my_id varchar(32); -- 自定义变量1  
declare my_name varchar(50); -- 自定义变量2  
DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环变量,默认false  
  
DECLARE My_Cursor CURSOR FOR ( SELECT id, name FROM Student limit 5); -- 定义游标并输入结果集  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 绑定控制变量到游标,游标循环结束自动转true  
  
OPEN My_Cursor; -- 打开游标  
  myLoop: LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到  
    FETCH My_Cursor into my_id, my_name; -- 将游标当前读取行的数据顺序赋予自定义变量12  
    IF done THEN -- 判断是否继续循环  
      LEAVE myLoop; -- 结束循环  
    END IF;  
    -- 自己要做的事情,在 sql 中直接使用自定义变量即可  
	set my_name = CONCAT(my_name,'ttt');
    UPDATE Student SET name = my_name WHERE id = my_id;
  
    COMMIT; -- 提交事务  
  END LOOP myLoop; -- 结束自定义循环体  
  CLOSE My_Cursor; -- 关闭游标  
END -- 结束存储过程  
;;
DELIMITER ;


游标

  游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。

  游标是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。一般复杂的存储过程,都会有游标的出现,他的用处主要有:

  1. 定位到结果集中的某一行。
  2. 对当前位置的数据进行读写。
  3. 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
  4. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

DECLARE CS CURSOR 是声明游标,for后面跟一个查询语句
 
 
 
 

猜你喜欢

转载自blog.csdn.net/xiao__miao/article/details/77251190
今日推荐