存储(类比C语言的函数)
变量
1 IN:输出变量
2 OUT:输入变量
3 INOUT:输入输出变量
存储的创建
通用:
create procedure <proc_name> ([IN/OUT args])
begin
-- SQL;
end;
案例:
create procedure proc_text1 (IN a int,IN b int,OUT c int)
begin
//定义局部变量:declare x int default 0;定义int型变量x,默认值为0;
SET c = a+b;
end;
//调用:
set @m = 0;//定义用户变量
call proc_text1(2,3,@m);
定义的用户变量以@开头,set直接定义,存储在数据库的字典(dual)中可以查询
select @name from dual;
查询表中数据赋值给变量:INTO 关键词
set @a;
create procedure proc_text2(OUT c int)
begin
select count(stu_num) INTO c from students;
end;
call proc_text2(@a);
分支循环语句
if then else语句
create procedure proc_text3(IN c int)
begin
if c = 1 then
-- SQL1
else//else可以不要
-- SQL2
end if;
end;
case语句
create procedure proc_text4(IN c int)
begin
case c
when 1 then
-- SQL1
when 2 then
-- SQL2
else//可以不写
-- SQL
end case;
end;
while 语句
create procedure proc_text5(IN c int)
begin
declare i int;
set i = 0;
while i<c do
-- SQL
set i=i+1;
end while;
end;
repeat语句
create procedure proc_text6(IN c int)
begin
declare i int;
set i =0;
repeat
-- SQL
set i = i+1;
until i>c end repeat;
end;
loop 语句
create procedure proc_text7(IN c int)
begin
declare i int;
set i =0;
myloop:loop
-- SQL
set i = i+1;
if i>c then
leave loop;
end if;
end loop;
end;
存储过程(函数)的查改删
查询
//根据数据库名查询存储过程
show procedure status where db = '数据库名';
//查询存储过程的细节
show create procedure 数据库名.函数名;
修改
alter procedure proc_text1 特征1 特征2...
特征参数:
contains sql 表示子程序包含sql语句,但不包含读或者写数据的语句
no sql表示子程序中不包含sql语句
reads sql data 表示子程序中包含读数据的语句
modifies sql data 表示子程序中包含写数据的语句
sql security {definer | invoker}指明谁有权限来执行
definer 表示只有定义者自己才能执行
invoker 表示调用者可以执行
comment ‘string’表示注释信息
删除
drop procedure proc_text1;
游标(相当于数组下标)
可以逐条返回查询的结果中的记录
1、声明与关联
利用declare声明一个变量 类型是cursor
再用关键词for+一个查询语句关联一个查询结果
declare cursor_name cursor for select ...
例:
declare mycursor cursor for select book_name,book_auther,book_price from books;
2、打开和使用
直接open + 游标名;打开游标
之后用fetch + 游标名 INTO 字段1 …取出游标的数据,之后游标会自动增1,所以可以用一个循环读出游标数据
declare bname varchar(40);
declare bauthor varchar(40);
declare bprice decimal(10,2);
declare i int default 0;
open mycursor;
while i < num;//结果集的数量
fetch mycursor into bname,bauthor,bprice;
set i = i+1;
-- set str = concat('~',bname,bauthor,bprice);本句与下一句功能一样
select concat_ws('~',bname,bauthor,bprice) into str;
set result = concat_ws(',',result,str);
end while;
close mycursor;//关闭游标
使用后注意关闭游标
用close