学习参考:
MySQL数据库 *实验17存储过程_数据库存储过程实验报告-CSDN博客
感觉就是相当于创建函数;
注意设置函数有一些特别的地方:
先直接来个例子:
创建这个存储过程标准格式大概如上 get_a_character是函数名字,drop procedure if exists是防止函数重复定义;
上面说过in/out/inout注意,因为相当于函数中的传参,out是函数内部的值,inout相当引用;
在内部填充代码,如果不是在函数名字声明的参数就要在内部进行声明才有效果,如果引用的是在sql内部设置过的@变量,可以直接使用@进行调用,至于在函数头设置的变量和函数内部使用declare设置的变量不加上@调用:
上面那题就如下的题解:
delimiter $$
drop procedure if exists get_word;
create procedure get_word(in s char(100),out w char(1))
Begin
declare len tinyint;
set len=char_length(s);
set w=substring(s,floor(rand()*(len+1)+1),1);
end $$
delimiter ;
再使用call进行调用,传入相应参数
有一个get_a_character的函数还要定义后面要用到
delimiter $$
drop procedure if exists get_a_character;
create procedure get_a_character(in s char(100),out w char(1))
begin
call get_word(s,w);
end $$
delimiter ;
set @x = '刘王张赵李钱朱何孙曾陈吴黄刘邓周毛江胡';
eg2:
delimiter $$
drop procedure if exists get_name;
create procedure get_name(out m varchar(2),out xb int)
begin
declare cd int;
declare ms1,ms2 varchar(50);
declare m1,m2,m3 varchar(2);
set ms1='依秋香巧紫萱莉玉碧丽念雅红燕艳莲荷蕾紫莹颖琪';
set ms2='澄德海超阳昌瀚亮锋涵煦杰俊诚毅峰衍浩广邈言博畅';
set xb = floor(rand()*2);
set cd = floor(rand()*2+1);
if xb = 0 then
call get_word(ms1,m1);
call get_word(ms1,m2);
set m3 = concat(m1,m2);
elseif xb = 1 then
call get_word(ms2,m1);
call get_word(ms2,m2);
set m3 = concat(m1,m2);
end if;
if cd = 1 then set m = m1;
elseif cd = 2 then set m = m3;
end if;
end $$
delimiter ;
eg3:
delimiter $$
drop procedure if exists main;
create procedure main()
begin
declare x varchar(100);
declare xing,ming,xm varchar(3);
declare sex,n int;
declare xh varchar(8)
create table xs2 as select 学号,姓名,性别 from xs where 1<>1 ;
set xh='191100';
set n=1;
while n<=20 do
call get_word(@x,@k);
set xing = @k;
call get_name(@name,@sex);
set ming = @name;
set sex = @sex;
set xm = concat(xing,ming);
insert into xs2 values(xh,xm,sex);
set n = n+1;
set xh = xh +1;
end while;
end $$
delimiter ;