赞
踩
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
语句删除其他的存储过程Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。