MySQL存储过程

存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用 SQL 语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用即可。

存储过程的优点

封装性

存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。

可增强 SQL 语句的功能和灵活性

存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

可减少网络流量

由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。

高性能

存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。

提高数据库的安全性和数据的完整性

使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。

存储过程的增删改查

创建存储过程

语法

create procedure <过程名> ( [过程参数[,…] ] ) 
<过程体>
  • 过程名:存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即 db_name.sp_name。过程名应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。
  • 过程参数:存储过程的参数列表。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有 1 个或多个参数。
  • MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。需要注意的是,参数的取名不要与数据表的字段名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作字段名,从而引发不可预知的结果。
  • 过程体:存储过程的主体部分,也称为存储过程体,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。
声明结束符

在存储过程的创建中,经常会用到 DELIMITER 命令,特别是对于通过命令行的方式来操作 MySQL 数据库的用户。
在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,为解决这个问题,通常可使用 DELIMITER 命令将结束命令修改为其他字符。
语法

delimiter <自定义结束符>
  • 自定义结束符:可以是一些特殊的符号,如“??”、“$$”、“//”等。
  • 避免使用反斜杠“\”作为结束符,因为它是 MySQL 的转义字符。

示例:在 MySQL 命令行客户端输入

mysql> delimiter //

成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就改为“//”了。
若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入

mysql> delimiter ;

注意:delimiter和结束符之间一定要有一个空格
创建不带参数的存储过程:查看每位同学每门课程的成绩

mysql> delimiter //
	   create procedure p()
	   begin
	   	select s_id,sum((c_id=01)*score) '01',sum((c_id=02)*score) '02',sum((c_id=03)*score) '03'
		from sc
		group by s_id;
	   end //
	   delimiter ;

调用存储过程

语法

call <过程名> ([过程参数[,] ]);

示例

mysql> call p;
+------+------+------+------+
| s_id | 01   | 02   | 03   |
+------+------+------+------+
| 01   |   80 |   90 |   99 |
| 02   |   70 |   60 |   80 |
| 03   |   80 |   80 |   80 |
| 04   |   50 |   30 |   20 |
| 05   |   76 |   87 |    0 |</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值