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

来源:互联网 发布:mac 炉石传说 插件 编辑:程序博客网 时间:2024/05/21 06:23

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

接下介绍自己的心得,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后面跟一个查询语句

原创粉丝点击