这几天觉得自己要研究一下存储过程,因为觉得自己数据库这块,自己也要加强一下
接下介绍自己的心得,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语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
游标是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。一般复杂的存储过程,都会有游标的出现,他的用处主要有:
- 定位到结果集中的某一行。
- 对当前位置的数据进行读写。
- 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
- 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。
DECLARE CS CURSOR 是声明游标,for后面跟一个查询语句