mysql 存储过程

Mysql存储过程详解(概念、优缺点以及创建调用实例)
原创小糖豆巴拉巴拉 发布于2019-05-31 17:45:06 阅读数 705 收藏
展开
这篇文章主要介绍一下存储过程,工作中是否用的到存储过程,很大程度跟公司有关,很多人用不上,所以不了解,闲暇之际,还是简单的总结了一下。

1、存储过程是什么?
其实存储过程很简单,无非就是按照其特定的语法,创建存储过程,然后在执行程序的时候,调用就行了。
怎么调用呢?下面是一个创建存储过程的实例

CREATE PROCEDURE myproc()
BEGIN
SELECT COUNT(*) FROM test;
END

在mysql数据库中函数一栏,可以看到存储过程函数
然后把原本写的sql语句的地方直接换成CALL myproc,就可以执行了,跟执行SELECT COUNT(*) FROM test;是一样的结果

2、存储过程和普通sql语句有什么不同?
储存过程就是把sql语句放在数据库创建,然后直接编译,然后程序就可以重复直接调用了。

3、存储过程有什么优缺点?
3.1 优点
存储过程在创建的时候直接编译,而sql语句每次使用都要编译,提高执行效率
一个存储过程可以被重复使用。(其实sql语句也可以,没什么卵用)
一条sql语句,可能需要访问几张表,对数据库连接好几次,存储过程只会连接一次
存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。(大概这就是存储过程存在的原因吧)
3.2 缺点
可移植性太差了
对于简单的sql语句,毫无意义
对于只有一类用户的系统安全性毫无意义
团队开发,标准不定好的话,后期维护很麻烦
对于开发和调试都很不方便。
复杂的业务逻辑,用存储过程还是很吃力的
基本上面的有点都是性能更快,但服务器也不会因为这一点性能而变得很慢,所以基本用存储过程的很少,一般情况下,不建议使用,比较麻烦,除非有特定需求。

4、调用实例
4.1查看存储过程状态
通过下面语句可以看到该数据库下所有的存储过程名称

show procedure status
1
也可以在数据库的函数一栏看到存储过程

4.2 查看存储过程详细
show create procedure dada
1
dada是存储过程函数名称

4.3 一个简单的存储过程实例
delimiter //
create procedure dada(out s int)
begin
select count(*) into s from mysql.user;
end
//
delimiter;

这里先解释一下delimiter //是什么意思
mysql客户端中分隔符默认是分号(;),所以如果不指定一个特殊的分隔符,可能会编译失败
上面语句将分隔符改为//,直到遇到下一个//才表示语句结束,这样可以保证创建语句完整。

上面的select count(*) into s from mysql.user;语句中 into s的意思对应out s int,表示声明输出值为一个int类型的值

其实不声明上面的输出值也是没问题的

delimiter //
create procedure dede()
begin
select count(*)from testfield.test_obe_event;
end
//
delimiter;

初上面解释之外,创建语句还是很容易懂得,这里不做其他解释

5、存储过程参数解释
上面都是比较简单的存储过程,但是大多数情况下都是有参数的,下面介绍存储过程的参数

5.1 、带输入参数的存储过程
drop procedure if exists sp1 //

create procedure sp1(in p int)
comment 'insert into a int value'
begin
/* 将输入参数的值赋给变量 */
set @v1 = p;(这里只是让大家学习一种变量声明方式,直接在v1前面加@,表示声明变量,也可以用declare v1 int声明)
insert into test(id) values(v1);
end
//

/* 调用这个存储过程 */
call sp1(1)//
/* 去数据库查看调用之后的结果 */
select * from test//

5.2、带输出参数的存储过程
drop procedure if exists sp2 //

create procedure sp2(out p int)
begin
select max(id) into p from test;
end
//
call sp2(@pv)//(调用该存储过程,注意:输出参数必须是一个带@符号的变量)

/* 查询刚刚在存储过程中使用到的变量 */
select @pv//

5.3、带输入和输出参数的存储过程
drop procedure if exists sp3 //

create procedure sp3(in p1 int , out p2 int)
begin
if p1 = 1 then
set @v = 10;(直接在v1前面加@,表示声明变量,也可以用declare v1 int声明)
else
set @v = 20;
end if;
/* 语句体内可以执行多条sql,但必须以分号分隔 */
insert into test(id) values(@v);
select max(id) into p2 from test;
end
//

/*调用该存储过程,注意:输出参数必须是一个带@符号的变量*/
call sp3(1,@ret)//

select @ret//

5.4、既做输入又做输出参数的存储过程
drop procedure if exists sp4 //
create procedure sp4(inout p4 int)
begin
if p4 = 4 then
set @pg = 400;
else
set @pg = 500;
end if;
select @pg;
end//
call sp4(@pp)//
/* 这里需要先设置一个已赋值的变量,然后再作为参数传入 */
set @pp = 4//
call sp4(@pp)//

原文地址:https://www.cnblogs.com/shangping/p/12158866.html