储存程序 (Stored Procedure),又可称预储程序或者存储过程,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序。

优点 预存程序具有下列的好处:
预存程序可封装,并隐藏复杂的商业逻辑。
预存程序可以回传值,并可以接受参数。
预存程序无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
预存程序可以用在数据检验,强制实行商业逻辑等。
缺点
预存程序,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的预存程序。
预存程序的性能调校与撰写,受限于各种数据库系统。

一,存储语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body

CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body

proc_parameter:
[ IN | OUT | INOUT ] param_name type

func_parameter:
param_name type

type:
Any valid MySQL data type

characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }

routine_body:
Valid SQL routine statement

当然也可以参见官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

二,存储示例

带传入参数的简单插入:

1
2
3
4
5
6
7
8
9
CREATE DEFINER=`root`@`localhost` PROCEDURE `insertUserInfo`(IN userId int,
in userName varchar (20),
in createdBy varchar(20))
BEGIN

INSERT INTO USER_INFO (USER_ID, USERNAME, CREATED_BY, CREATED_DATE)
VALUES (userId, userName, createdBy, NOW());

END

带传入参数的简单查询:

1
2
3
4
5
6
CREATE DEFINER=`root`@`localhost` PROCEDURE `findUserInfoById`(IN userId int)
BEGIN

select * from USER_INFO where USER_ID = userId ;

END