文章目录
1.5.1. IF - THEN - ELSEIF - ELSE -ENDIF
1.5.2. CASE - WHEN - THEN - ELSE - END CASE
CONCAT(..)
,LENGTH(str)
。但是我们也可以自己定义存储函数。delimiter // -- 指定分割符
create function fun_name()
returns type -- type是执行存储函数返回的类型
begin
-- 执行其他的语句
return (); -- 返回的数据
end
//
delimiter ; -- 指定创建结束
returns type
: 指定存储函数返回的类型,比如returns char(50)
,returns int
return ()
: 存储函数的返回值,这里的返回值类型需要和returns type
中的类型一致,如果不一致会强制转换return (select name from user where id=1);
user
表中的id=1
的name
值delimiter //
create function selectUserById()
returns varchar(50)
begin
return (select name from user where id=1);
end
//
delimiter ;
IN
参数,而存储过程中的参数可以是IN
、OUT
、INOUT
parameter 类型
指定即可,如果有多个参数可以使用,
分割select funName(parmeter1,....);
即可delimiter //
create function selectUserById(uid int)
returns varchar(50)
begin
return (select name from user where id=uid);
end
//
delimiter ;
select selectUserById();
: 直接在存储函数所在数据库中调用select dbName.selectUserById();
: 直接使用数据库的名称调用drop function selectUserById;
:直接在存储函数所在数据库中直接删除存储函数drop function dbName.selectUserById;
:使用数据库名称删除存储函数show function status [like pattern]
: 查看存储函数的状态show function status \G
: 查看所有的存储函数状态,\G
是一种特定格式的输出show function status like 'select%'\G
:查看select
开头的存储函数状态,\G
是一种特定格式的输入。show create function dbName.funName
show create function test.selectUserById \G;
:查询test
数据库中的存储函数selectUserById
的定义,\G
是一种特定的输出格式begin.....end
程序中declare var_name,.... type [default value]
declare age int default 22
:定义一个局部变量age
,类型为int
,默认值为22
declare var1,var2,var3 int
: 定义三个局部变量,类型为int
@
开头set @pin=10
set var1=value1,[var2=value2,....]
set age=33;
: 设置age的值为33set var1=22,var2=33
: 同时设置多个值declare var1,var2,var3 int;
set var1=22,var2=33;
set var3=var1+var2;
select col_name[,...] into var_name[,....] table_expr
: 使用select
查询得到的结果赋值给变量select
把选定的列的值直接赋值给对应位置的变量table_expr
: 可以是表的查询条件,其中包含from 表名
declare uname varchar(10); -- 定义变量uname
declare uage int; -- 定义变量uage
select name,age into uname,uage from user where id=1; -- 将id=1的用户姓名和年龄赋值给变量
delimiter //
create function selectUserById(uid int)
returns varchar(50)
begin
declare uname varchar(50);
select name into uname from user where id=uid;
return uname;
end
//
delimiter ;
delimiter //
create procedure selectUserById(IN uid int)
begin
declare offest,count int; -- 定义偏移量
set offest=0,count=2; -- 赋值
if uid is not null -- 如果uid不为null,按照id查询
then select * from user where id=uid; -- 按照id查询
else select * from user limit offest,count; -- 否则uid为null,按照分页查询前面两个
end if;
end
//
delimiter ;
call selectUserById(1)
; : 查询id=1
的用户信息call selectUserById(null);
:查询所有的用户信息,显示前面两个begin
和end
之间使用begin
if expression -- 判断条件
then .... ; -- 条件成立执行
elseif .....; -- 其他条件
else ..... ; -- 条件相反执行
endif; -- 结束if
end
if
,或者if-else
else
,那么可以省略,比如if - then - endif
=
delimiter //
create procedure selectUserById(IN uid int)
begin
declare offest,count int; -- 定义偏移量
set offest=0,count=2; -- 赋值
if uid is not null -- 如果uid不为null,按照id查询
then select * from user where id=uid; -- 按照id查询
else select * from user limit offest,count; -- 否则uid为null,按照分页查询前面两个
end if;
end
//
delimiter ;
switch-case-default
相似case expr
when value1 then ....;
when value2 then .....;
when......;
....
else .......;
end case;
case
delimiter //
create procedure deleteUserById(IN uid int)
begin
case uid -- uid做选择
when 1 -- uid==1
then delete from user where id=1;
when 2 -- uid==2
then delete from user where id=2;
else
delete from user; -- 删除全部
end case;
end;
//
delimiter ;
LOOP
只是创建一个循环执行的过程,并不进行条件判断,这个和while
不一样,不需要判断条件,如果不跳出,那么将会永远的执行的下去。但是我们可以使用leave
跳出循环[LOOP_LABEL]:LOOP
statement;
END LOOP [LOOP_LABEL];
9
条数据,如果i>=10
跳出循环delimiter //
create procedure insertUserByName(IN uname varchar(50))
begin
declare i int default 0;
add_loop:loop -- 开始循环
set i=i+1; -- id++操作
insert into user(name) values(uname); -- 插入语句
if i>=10
then leave add_loop; -- 使用leave跳出循环
end if;
end loop add_loop; -- 结束循环
end
//
delimiter ;
iterate label
iterate
只可以出现在LOOP
,REPEAT
,WHIE
语句内,表示再次循环的意思,label
表示循环的标志
p<10
重复执行p++
delimiter //
create procedure doiterate()
begin
declare p int default 0; -- 定义局部变量
my_loop:loop
set p=p+1; -- p++
if p<10
then iterate my_loop; -- 继续执行前面的循环的语句,p++
elseif p>20
then leave my_loop;
end if
select "p在10到20之间" -- 输出语句
end loop my_loop;
end
//
delimiter ;
do-while
[repeat_loop]: repeat
statement_list;
until exper -- 没有分号
end repeat;
delimiter //
create procedure dorepeat()
begin
declare p int default 0; -- 定义局部变量
my_loop:repeat
set p=p+1;
select p;
until p>10 -- 当p>10的时候循环结束
end repeat my_loop;
end
//
delimiter ;
REPEAT
不同,先进行判断,然后才执行语句[while_label]:while expr do
statement_list;
end while [while_lable];
delimiter //
create procedure dowhile()
begin
declare p int default 0; -- 定义局部变量
my_loop:while p<10 do -- 满足条件才执行
set p=p+1; -- p++
end while my_loop; -- 结束循环
end
//
delimiter ;
delimiter //
create procedure p_name([IN,OUT,INOUT]parameter 类型.....)
begin
-- 执行功能
end
//
delimiter ;
BEGIN
与END
进行标识。id
查询的查询用户信息的存储过程,这里的id是由用户输入的,因此可以使用IN
参数delimiter //
create procedure selectUserById(IN uid int)
begin
select * from user where id=uid;
end
//
delimiter ;
call procedure_name(...)
call selectUserById(1);
: 直接在当前的数据库中调用存储过程selectUserById
call db_name.selectUsrById(1)
: 指定数据库的名字调用show procedure status like pattern \G
show procedure status like "select%"\G
: 查看select
开头的存储过程状态show procedure status \G
: 查看所有的存储过程状态*************************** 1. row ***************************
Db: test -- 数据库名称
Name: selectUserById -- 存储过程的名字
Type: PROCEDURE
Definer: root@localhost
Modified: 2018-06-25 22:25:44
Created: 2018-06-25 22:25:44
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.01 sec)
show create procedure db.pro_name
show create procedure test.selectUserById\G
: 查询数据库test
中存储过程的定义*************************** 1. row ***************************
Procedure: selectUserById
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `selectUserById`(IN uid int)
begin
select * from user where id=uid;
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
drop procedure pro_name
drop procedure selectUserById
: 删除当前数据库的selectUserById
的存储过程drop procedure test.selectUserById;
: 删除test
数据库的selectUserById
的存储过程declare cursor_name cursor for select_statement
cursor_name
: 游标的变量名称select_statement
:表示select
语句,用于返回一个结果集给游标declare users cursor for select name,age from user;
open cursor_name;
open users
fetch cursor_name into var_name[,var_name,...]
cursor_name
:表示游标的名称var_name
: 表示将select
语句查询到的一行信息存入到该参数中,var_name
必须在声明游标之前定义好fetch user into uname,uage
close cursor_name
user
表中的一行数据delimiter //
create procedure selectOneUser()
begin
declare uname varchar(50); -- 定义uname存储
declare uage int; -- 定义uage存储
declare users cursor for select name,age from user; -- 声明游标
open users; -- 打开游标
fetch users into uname,uage; -- 获取一行数据到存储到uname和uage中
select uname as name,uage as age; -- 输出一行的结果
close users; -- 关闭游标
end
//
delimiter ;
call selectOneUser(); -- 调用存储过程,此时只是输出第一行的数据
select count(*)
获取总数delimiter //
create procedure selectUsers()
begin
declare uname varchar(50); -- 定义uname存储
declare uage int; -- 定义uage存储
declare total int default 0; -- 定义count,这个用来统计总数
declare i int default 1; -- 用来循环
declare users cursor for select name,age from user; -- 声明游标
select count(*) from user into total; -- 查询总数
open users; -- 打开游标
-- 开始循环遍历
my_loop:while i<=total do
set i=i+1; -- i++
fetch users into uname,uage; -- 获取一行数据到存储到uname和uage中
select uname as name,uage as age; -- 输出一行的结果
end while my_loop;
close users; -- 关闭游标
end
//
delimiter ;
call selectUsers(); -- 调用存储过程,获取全部数据
HANDLER
判断游标是否还有元素continue HANDLER for not found
delimiter //
create procedure selectUsers()
begin
declare uname varchar(50); -- 定义uname存储
declare uage int; -- 定义uage存储
declare flag int default 1; -- 创建结束游标的标志,默认值为1
declare users cursor for select name,age from user; -- 声明游标
declare continue HANDLER for not found set flag=0; -- 指定游标结束时的返回值
open users; -- 打开游标
my_loop:loop
if flag=0 -- 这里使用=,否则报错
then leave my_loop; -- 跳出循环
end if;
fetch users into uname,uage; -- 获取一行数据到存储到uname和uage中
select uname as name,uage as age; -- 输出一行的结果
end loop my_loop;
close users; -- 关闭游标
end
//
delimiter ;
return
返回一个返回值,但是存储过程不能有返回值,如果需要实现返回的功能,可以使用OUT
参数实现返回insert
,update
,delete
,create
等语句;存储函数只完成查询的工作,可接受输入参数并返回一个结果,也就是函数实现的功能针对性比较强。call
调用其他的存储过程,但是不能使用drop
语句删除其他的存储过程
delimiter //
create function selectUserById()
returns varchar(50)
begin
declare uname varchar(50);
select name into uname from user where id=2;
return uname;
end
//
delimiter ;