存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
一、存储过程概述
1.1、什么是存储过程
存储过程是数据库中的一个重要对象。
存储过程是在数据库系统中,一组为了完成特定功能的SQL 语句集。存储过程是存储在数据库中,一次编译后,到处运行。不需要再次编译,用户通过指定存储过程的名字并传递参数(如果该存储过程带有参数)来执行。
1.2、存储过程特点
用来完成较复杂业务
比较灵活,易修改,好编写,可编程性强
编写好的存储过程可重复使用
1.3、存储过程优缺点
优点
存储过程在创建的时候直接编译,sql语句每次使用都要编译,效率高。
存储过程可以被重复使用。
存储过程只连接一次数据库,sql语句在访问多张表时,连接多次数据库。
存储的程序是安全的。存储过程的应用程序授予适当的权限。
缺点
在那里创建的存储过程,就只能在那里使用,可移植性差。
开发存储过程时,标准不定好的话,后期维护麻烦。
没有具体的编辑器,开发和调试都不方便。
太复杂的业务逻辑,存储过程也解决不了。
二、存储过程创建
2.1、创建格式
格式:
create procedure 过程名()
begin
......
end;
案例:
查看员工与部门表中的全信息
create procedure dept_emp()
begin
select * from dept;
select * from emp;
end;
mysql> call dept_emp();
+----+-----------+
| id | name |
+----+-----------+
| 1 | 研发部 |
| 2 | 渠道部 |
| 3 | 教务部 |
| 4 | 执行部 |
+----+-----------+
4 行于数据集 (0.02 秒)
+----+--------+--------+--------+------------+---------+
| id | name | gender | salary | join_date | dept_id |
+----+--------+--------+--------+------------+---------+
| 1 | 张三 | 男 | 7200 | 2013-02-24 | 1 |
| 2 | 李四 | 男 | 3600 | 2010-12-02 | 2 |
| 3 | 王五 | 男 | 9000 | 2008-08-08 | 2 |
| 4 | 赵六 | 女 | 5000 | 2015-10-07 | 3 |
| 5 | 吴七 | 女 | 4500 | 2011-03-14 | 1 |
| 6 | 王一 | 男 | 8768 | 2013-12-05 | NULL |
| 7 | 王二 | 女 | NULL | NULL | NULL |
+----+--------+--------+--------+------------+---------+
7 行于数据集 (0.05 秒)
Query OK, 0 rows affected (0.05 秒)
2.2、变量
格式:
declare 变量名 变量类型 default 默认值; #声明变量
set 变量名=值; #变量赋值
select 字段名 into 变量名 from 数据库表; #查询表中字段,完成变量赋值
select 变量名; #显示变量
案例:
查看员工表中id=1的员工的姓名
create procedure emp_name()
begin
declare ename varchar(20) default '';
select name into ename from emp where id=1;
select ename;
end;
mysql> call emp_name();
+--------+
| ename |
+--------+
| 张三 |
+--------+
1 行于数据集 (0.01 秒)
Query OK, 0 rows affected (0.01 秒)
2.3、变量作用域
存储过程中变量是有作用域的,作用范围在begin和end块之间,end结束变量的作用范围即结束。
变量可分为:
局部变量: begin和end块之间
全局变量: 放在所有代码块之前;传参变量是全局的,可以在多个块之间起作用
案例:
查看员工的人数与部门表中的部门数,并找出最高和最低工资(局部变量)
create procedure dept_or_emp()
begin
begin
declare e_n int default 0;
declare d_n int default 0;
select count(*) into e_n from emp;
select count(*) into d_n from dept;
select e_n,d_n;
end;
begin
declare max_s double default 0;
declare min_s double default 0;
select max(salary) into max_s from emp;
select min(salary) into min_s from emp;
select max_s,min_s;
end;
end;
mysql> call dept_or_emp();
+------+------+
| e_n | d_n |
+------+------+
| 7 | 4 |
+------+------+
1 行于数据集 (0.26 秒)
+-------+-------+
| max_s | min_s |
+-------+-------+
| 9000 | 3600 |
+-------+-------+
1 行于数据集 (0.26 秒)
Query OK, 0 rows affected (0.26 秒)
查看员工的人数与部门表中的部门数,并找出最高和最低工资(全局变量)
create procedure dept_or_emp1()
begin