关于作者
程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。
最近刚写了一个手机在线播放的H5电影站:http://www.ifilm.ltd
MySQL存储过程暴力入门
要在数据库中使用存储过程必须先了解数据库中如何使用变量和自定义函数,暴力入门开始。
变量
系统变量和用户自定义变量的区别是用户自定义变量在
查看时使用一个@,而系统变量使用两个@
系统变量
介绍:用户不能定义系统变量,但是可以修改和使用
使用:使用select获取变量的值,但是因为select默认会将所有的字符串当做一个表的字段来查询,所以如果是变量需要使用@@符号来访问
查看所有系统内置变量命令:show variables;
查看某个系统变量 命令:select @@变量名; ,如select @@version
修改变量(局部修改)命令:set 变量名 = 值 ,如set autocommit = 3;
自定义变量
自定义变量语法:set @变量名 = 值; ,如`set @name = 'saboran';
查看自定义变量值:select @name;
变量作用域
外部定义的变量叫做全局变量,全局变量与js中的全局变量一样,能够在函数内部被使用;
局部变量:declare 变量 数据类型
局部变量不能在函数外部访问。
自定义函数
语法
create function 函数名(参数列表) returns 数据类型
begin
// 函数体
// 返回值
end
举个栗子
delimiter $$
create function avg(first int) returns int
begin
declare value ;
set value = first;
return value;
end
$$
自定义函数不能跨库
查看所有自定义函数语法:show function status \G
删除指定自定义函数语法:drop function functionName ;
函数内部的结构
函数内部默认是顺序结构,但是也可以使用分支结构和循环结构
分支结构
if 分支结构语法:
if 条件 then
// 语句
else
// 语句
end if ;
举个栗子
-- 修改sql语句结束符
delimiter $$
create function test_if(age int) returns varchar(100)
begin
-- 判断传入值是否大于20
if age < 20 then
return '劝君惜取少年时';
else
return '风华正茂';
end if;
end
$$
循环结构
while 循环语法
循环名字:while 条件 do
// 循环体
end while ;
在mysql中也有类似continue和break的语句,iterate对应continue,leave对应break,执行语法 :iterate/leave 循环名字
举个栗子
delimiter $$
-- 从1开始计算到指定数字的和
create function test_while(number int) returns int
begin
-- 定义局部变量返回值,默认为0
declare res int default 0;
-- 定义个局部变量,默认值为1
declare i int default 1;
-- 循环操作
sum_number:while i <= number do
set res = res + i;
set i =i + 1;
end while;
-- 返回值
return res;
end
$$
在函数内部可以使用和修改全局变量
存储过程
存储过程就是一个函数,函数是为了解决公有问题,在很多地方可以调用,存储过程也是为了解决特定问题而存在的
定义存储过程
语法:
create procedure 存储过程名字(参数列表)
begin
// 过程体
end
举个栗子
delimiter $$
create procedure test_procedure()
begin
-- 一条查询语句
select * from orders;
end
$$
调用存储过程
因为存储过程没有返回值,所以不能直接使用select,select只能调用函数和字段
调用语法:call 存储过程名字(参数列表)
举个栗子
-- 调用上面写的测试的存储过程
call test_procedure;
查看存储过程
与查看函数类似
show procedure status
删除存储过程
语法: drop procedure 存储过程名字
存储过程与函数参数的区别
存储过程对的参数有三种自己的定义类型
in: 该参数只能从外部传入,不能从内部传出去,只能读取外部的值
out:只能从内部把数据传出去,不能读取变量在外部定义的值,只能在存储过程内部对其进行赋值和访问
inout:既能从外部传入,又能从内部传出,既可以读取外部的值,又可以在内部进行赋值,从而实现对外部的值的修改。
语法:in/out/inout 参数名字 参数类型