#复习
delimiter //
create procedure p0001()
begin
declare cname varchar(20);
declare id varchar(10);
declare num int;
set cname='人民邮电出版社';
set id=(select 出版社ID from 出版社信息 where 出版社名称=cname);
set num=(select count(*) from 图书信息 where 出版社=id);
select cname,id,num;
end //
delimiter ;
call p0001()
#参数格式: in(输入参数) |out(输出参数) | inout(同时具有in和out参数的特性)
#in参数
delimiter //
create procedure p0002(IN a varchar(20)) #输入参数a,将值通过a传入进去
begin
declare cname varchar(20);
declare id varchar(10);
declare num int;
set cname=a;
set id=(select 出版社ID from 出版社信息 where 出版社名称=cname);
set num=(select count(*) from 图书信息 where 出版社=id);
select cname,id,num;
end //
delimiter ;
call p0002('高等教育出版社') #调用,括号里的参数通过a传递进来
call p0002('清华大学出版社') #通过in输入参数,可以通过call多次调用不同的数据
#out参数
delimiter //
create procedure p0003(IN a varchar(20),OUT b int)
begin
declare cname varchar(20);
declare id varchar(10);
declare num int;
set cname=a;
set id=(select 出版社ID from 出版社信息 where 出版社名称=cname);
set num=(select count(*) from 图书信息 where 出版社=id);
set b=num;
end //
delimiter ;
call p0003('高等教育出版社',@b); #out参数输出b的值
select @b; #查询用户变量b
#inout参数
#输入出版社名称,输出这个出版社出版的最贵的图书名称
delimiter //
create procedure p0004(INOUT c varchar(20)) -- inout参数
begin
declare cname varchar(20);
declare id varchar(10);
declare num int;
set cname=c;
set id=(select 出版社ID from 出版社信息 where 出版社名称=cname);
set c=(select 图书名称 from 图书信息 where 价格=(select max(价格) from 图书信息 where 出版社=id));
end //
delimiter ;
set @num='高等教育出版社'; #使用inout需提前赋值
call p0004(@num);
select @num;
#练习:创建存储过程,求1-m的累加和delimiter $$
delimiter //
create procedure p0005(IN m int)
begin
declare i int;
declare s int;
set i=0;
set s=0;
while i<m do
set i=i+1;
set s=s+i;
end while;
select s; #查询s的总值
end //
delimiter ;
call p0005(100);
#自定义函数
/*
delimiter //
create function <函数名称>(参数)
returns 自定义类型
deterministic begin
declare 参数名称 参数类型;
set 参数;
return 返回的参数;
end //
delimiter ;
select 函数名称(需要的参数);
*/
#例:
delimiter //
create function f1(a varchar(20))
returns varchar(30)
DETERMINISTIC begin
declare tname varchar(30);
set tname=(select 类型名称 from 商品类型 where 类型编号=a);
return tname;
end //
delimiter ;
select f1('t030102')