1、概述
MySQL5.0版本开始支持存储过程。
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用得一种数据库对象。
存储过程是为了完成特定功能得SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程得名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面得代码封装与重用。
1.1 优点
存储过程可封装,并隐藏复杂得商业逻辑。
存储过程可以回传值,并可以接受参数。
存储过程无法使用 SELECt 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
存储过程可以用在数据检验,强制实行商业逻辑等。
1.2 缺点
存储过程,往往定制化于特定得数据库上,因为支持得编程语言不同。
当切换到其他厂商得数据库系统时,需要重写原有得存储过程。
存储过程得性能调校与撰写,受限于各种数据库系统。
2、存储过程得创建和调用
存储过程就是具有名字得一段代码,用来完成一个特定得功能。
创建得存储过程保存在数据库得数据字典中。
2.1 创建存储过程
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name 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 [begin_label:] BEGIN [statement_list] …… END [end_label]
2.2 MYSQL 存储过程中得关键语法
2.2.1 声明语句结束符,可以自定义:
DELIMITER $
或
DELIMITER //
2.2.2 声明存储过程:
CREATE PROCEDURE demo_in_parameter(IN p_in int)
2.2.3 存储过程开始和结束符号:
BEGIN .... END
2.2.4 变量赋值:
SET 等p_in=1
2.2.5 变量定义:
DECLARE l_int int unsigned default 4000000;
2.2.6 创建mysql存储过程、存储函数:
create procedure 存储过程名(参数)
2.2.7 存储过程体:
create function 存储函数名(参数)
3、创建存储过程实例
3.1 创建表
mysql> SET NAMES utf8mb4;
Query OK, 0 rows affected (0.00 sec)
mysql> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> CREATE TABLE `one_data` (
-> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键发布者会员账号',
-> `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '名称',
-> `sort_number` int(11) NULL DEFAULT NULL COMMENT '序号',
-> `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
-> PRIMARY KEY (`id`) USING BTREE
-> ) ENGINE = InnoDB AUTO_INCREMENT = 472 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '创建事件每秒添加一条数据' ROW_FORMAT = Dynamic;
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)
3.2 创建存储过程(批量插入数据)
-- 创建存储过程delimiter
-- 这里得delimiter后面一定要加一个空格不然会报错
mysql> delimiter $
mysql> create procedure doinsert ()
-> begin
-> declare i int;
-> set i = 0;
-> while(i<=200) do
-> INSERT INTO `one_data`( `name`, `sort_number`, `create_time`) VALUES (CONCAt('名称',i), i, NOW());
-> set i = i+1;
-> end while;end;
-> $
Query OK, 0 rows affected (0.01 sec)
--删除存储过程
mysql> drop procedure doinsert;
Query OK, 0 rows affected (0.01 sec)
mysql>
3.3 调用存储过程
-- 调用存储过程
mysql> call doinsert();$
Query OK, 1 row affected (0.44 sec)
mysql>
3.4 查看批量插入得数据
mysql> SELECT * FROM `one_data`;