加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

细谈Mysql的存储进程和存储函数

发布时间:2022-03-17 15:29:52 所属栏目:编程 来源:互联网
导读:细谈Mysql的存储过程和存储函数: 1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句)和过程式sql语句(如IF...THEN...ELSE控
      细谈Mysql的存储过程和存储函数:

1 存储过程
      1.1 什么是存储过程
      存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句)和过程式sql语句(如IF...THEN...ELSE控制结构语句)组成。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
 
      1.2 存储过程的优缺点
优点:
 
1.可增强sql语言的功能和灵活性
存储过程可以用流程控制语言编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
2.良好的封装性
存储过程被创建后,可以在程序中被多次调用,而不必担心重写编写该存储过程的sql语句。
3.高性能
存储过程执行一次后,其执行规划就驻留在高速缓冲存储器中,以后的操作中只需要从高速缓冲器中调用已编译好的二进制代码执行即可,从而提高了系统性能。
 
缺点:
存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
 
1.3 创建存储过程
1.3.1 DELIMITER定界符
在sql中服务器处理sql语句默认是以分号作为语句的结束标志,然而在创建存储过程时,存储过程体中可能包含多条sql语句,这些sql语句如果仍以分号作为语句结束符,那么服务器在处理时会以第一条sql语句处的分号作为整个程序的结束符,而不再去处理后面的sql。
为解决这个问题,通常使用DELIMITER命令,将sql语句的结束符临时修改为其他符号。
DELIMITER语法格式:
DELIMITER $$
$$是用户定义的结束符,通常这个符号可以是一些特殊的符号。另外应避免使用反斜杠,因为他是转义字符。
若希望换回默认的分号作为结束标记,只需再在命令行输入下面的sql语句即可。
DELIMITER ;
1.3.2 存储过程创建
在Mysql中,使用CREATE PROCEDURE语句来创建存储过程。
CREATE PROCEDURE p_name([proc_parameter[,...]])
routine_body
 
1.3.3 局部变量
在存储过程体中可以声明局部变量,用来存储过程体中的临时结果。在Mysql中使用DECLARE语句来声明局部变量。
DECLARE var_name type [DEFAULT value]
 
"var_name"用于指定局部变量的名称;"type"用来声明变量的类型;"DEFAULT"用来指定默认值,如果没有指定则为NULL。
 
注意:局部变量只能在存储过程体的BEGIN...END语句块中;局部变量必须在存储过程体的开头处声明;局部变量的作用范围仅限于声明它的BEGIN...END语句块,其他语句块中的语句不可以使用它。
 
1.3.4 用户变量
用户变量一般以@开头。
注意:滥用用户变量会导致程序难以理解及管理。
1.3.5 SET语句
在Mysql中通过SET语句对局部变量赋值,其格式是:
SET var_name = expr[,var_name2 = expr]....
 
1.3.7 流程控制语句
 
条件判断语句
if-then-else 语句:
 
mysql > DELIMITER &&
mysql > CREATE PROCEDURE proc2(IN parameter int)
 -> begin
 -> declare var int;
 -> set var=parameter+1;
 -> if var=0 then
 -> insert into t values(17);
 -> end if;
 -> if parameter=0 then
 -> update t set s1=s1+1;
 -> else
 -> update t set s1=s1+2;
 -> end if;
 -> end;
 -> &&
mysql > DELIMITER ;
 
 
case语句:
mysql > DELIMITER &&
mysql > CREATE PROCEDURE proc3 (in parameter int)
 -> begin
 -> declare var int;
 -> set var=parameter+1;
 -> case var
 -> when 0 then
 -> insert into t values(17);
 -> when 1 then
 -> insert into t values(18);
 -> else
 -> insert into t values(19);
 -> end case;
 -> end;
 -> &&
 
它在执行操作后检查结果,而 while 则是执行前进行检查。
mysql > DELIMITER &&
mysql > CREATE PROCEDURE proc5 ()
 -> begin
 -> declare v int;
 -> set v=0;
 -> repeat
 -> insert into t values(v);
 -> set v=v+1;
 -> until v>=5
 -> end repeat;
 -> end;
 -> &&
mysql > DELIMITER ;
repeat
 --循环体
 until 循环条件
end repeat;
loop ·····endloop:
loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环。
mysql > DELIMITER &&
mysql > CREATE PROCEDURE proc6 ()
 -> 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;
 -> &&
mysql > DELIMITER ;
ITERATE迭代:
 
1.3.8 游标
MySQL中的游标可以理解成一个可迭代对象(类比Python中的列表、字典等可迭代对象),它可以用来存储select 语句查询到的结果集,这个结果集可以包含多行数据,从而使我们可以使用迭代的方法从游标中依次取出每行数据。
 
MySQL游标的特点:
1.只读:无法通过光标更新基础表中的数据。
2.不可滚动:只能按照select语句确定的顺序获取行。不能以相反的顺序获取行。 此外,不能跳过行或跳转到结果集中的特定行。
3.敏感:有两种游标:敏感游标和不敏感游标。敏感游标指向实际数据,不敏感游标使用数据的临时副本。敏感游标比一个不敏感的游标执行得更快,因为它不需要临时拷贝数据。MySQL游标是敏感的。

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读