存储过程和函数
文章目录
存储过程和函数的概念
存储过程和视图类似,都是一个事先写好并编译后存在数据库中的MySQL语句集合。
是用于简化开发人员的工作,减少数据在数据库和应用服务器之间传输,提高处理效率的。
存储过程和函数的区别
既然是函数,就会就值的传入和传出,其中存在的区别为:
存储过程:参数的传递(参数类型)能用IN
、OUT
、INOUT
,并且没有直接的返回值。
IN
表示数据传入OUT
表示数据传出INOUT
表示既可以传入又可以传出
函数:参数只能使用IN,并且必须要有返回值。
存储过程
存储过程 语句(procedure)
无参存储过程
创建无参存储
delimiter //
##开始创建存储过程
create procedure 存储过程名()
begin
#SQL语句
end//
delimiter
MySQL执行的过程中,会以 ;
作为结束命令
delimiter 是一个编译器指令,告诉MySQL解释器,MySQL是否可以执行了,该段命令是否已经结束了
delimiter 指令的使用
delimiter //
#存储过程
//
delimiter //
开始 执行完后需要//
结束,最后在将 delimiter ;
改回来
调用存储过程
call 存储过程名();
call 存储过程(变量);
查看存储过程
show create procedure 存储过程名;
删除存储过程
drop procedure 存储过程名;
修改存储过程
alter procedure 存储过程名;
带参存储过程
创建带参存储过程
create procedure 存储过程名(
in[out][inout] 参数名1 参数类型1,
in[out][inout] 参数名2 参数类型2,……,
in[out][inout] 参数名n 参数类型n)
begin
SQL语句;
end;
调用带参存储过程
call 存储过程名(参数值1,参数值2,……,参数值n);
运用带参存储过程查询数据
例如:
create procedure setData(
in c_id int,in c_name varchar(20),in c_age int)
begin
insert into student_tb value(c_id,c_name,'女',c_age,null);
select * from student_tb;
end$$
##调用存储过程
call setData(21,'张三',rand()*10+10);
call setData(22,'李四',rand()*10+10);
运用带参存储过程插入数据
例如:
create procedure put(in stu_no int,in stu_name varchar(30),in stu_birthday date,in stu_cno int)
begin
insert into student values(stu_no,stu_name,stu_birthday,stu_cno);
end;
call putstr(11,'胖七','2000-1-1',2);
会话变量
查看会话变量 当前连接有效 重新连接恢复默认值
其他的客户端看不到自己定义的会话变量
show session variables;
全局变量
查看全局变量
当前服务有效
重启服务恢复默认值
show global variables;
注意:有些变量都是系统自定义的,用于存储数据库中的默认数据
自定义函数
create function 函数名(函数参数 类型)
returns 返回值类型
begin
##逻辑代码
return(函数返回值)
end;
8.0版本数据库,增加了一个安全选项
需要执行一段下面的代码才能创建
set global log_bin_trust_function_creators=TRUE;
调用函数:
直接使用函数
select 函数名(函数参数);
函数参数可以用查询的表格数据作为参数
select 函数名(表格属性) from 表格名
删除函数:
drop function 函数名;
存储过程和函数的区别
- 函数只能返回一个变量,而存储过程可以返回多个;
- 函数的限制比较多,不能用临时表(select),只能用表变量,存储过程限制少;
- 存储过程处理的功能比较复杂,而函数实现的数据科学计算针对性强;
- 存储过程可以执行修改表的操作,但是函数不能执行一组修改全局数据库状态的操作;
- 存储过程可以通过out返回多个参数,如记录集,函数只能返回值或者表对象
总结
- 存储过程的使用
- 函数的使用
- 函数和存储过程的区别