mysql存儲過程基礎知識

cursor遊標應用

select * from tbl_student0101;

drop procedure if exists crt_std;
delimiter //
create procedure crt_std()
BEGIN
	declare std_nm char(20);
	declare std_age int;
	declare std_tel char(11);
	declare std_cur cursor for select name, age, tel from tbl_student0101;
	open std_cur;
	LOOP
		fetch std_cur into std_nm, std_age, std_tel;
		select std_nm, std_age, std_tel;
	END LOOP;
	close std_cur;
END;
//
DELIMITER  ;
call crt_std();

if條件和變量的使用


drop procedure if exists pro_name;
delimiter$
create procedure pro_name(in height int, out description varchar(100))
begin
	declare max_len int default 180;
	declare mid_len int default 170;

	if height >= max_len then
		set description='nice';
		
	elseif height > mid_len and height < max_len then
		set description='pretty';
	else
		set description='bad';
	end if;
end$
delimiter;
call pro_name(200, @description);

select @description;

在這裏插入圖片描述
@var_nm: 是用戶會話變量,生命週期是整個會話期間,相當於全局變量;
declare var_nm:是局部變量,生命週期在begin和end之間;
@@var_nm:系統變量

case的使用
在這裏插入圖片描述

# 方式一
drop procedure if exists pro_name;
delimiter$
create procedure pro_name(in height int, out description varchar(100))
begin
	declare max_len int default 180;
	declare mid_len int default 170;
	case height
		when 180 then 
			set description='nice';
	  when 170 then 
			set description='pretty';
		else 
			set description='bad';
	end case;
end$
delimiter;
call pro_name(170, @description);

select @description;
#方式二
drop procedure if exists pro_name;
delimiter$
create procedure pro_name(in height int, out description varchar(100))
begin
	declare max_len int default 180;
	declare mid_len int default 170;
	case
		when height > max_len then 
			set description='nice';
	  when height > mid_len and height < max_len then 
			set description='pretty';
		else set description='bad';
	end case;
end$
delimiter;
call pro_name(175, @description);

select @description;

while循環使用
while condition do
list
end while

drop procedure if exists pro_name;
delimiter$
create procedure pro_name(in cnt int)
begin
	declare total int default 0;
	while  cnt > 0 do
		set total =  total + 1;
		set cnt = cnt -1;
	end while;
	select total;
end$
delimiter;
call pro_name(25);

repeat使用
repeat
list
until condtion;
end repeat;

drop procedure if exists pro_name;
delimiter$
create procedure pro_name(in cnt int)
begin
	declare total int default 0;
	repeat
		set total =  total + 1;
		set cnt = cnt -1;
		until cnt<=0
	end repeat;
	select total;
end$
delimiter;
call pro_name(25);

loop循環,需要有退出條件,一般和leave一起使用
lable:loop
list
condition
leave lable;
end loop;

drop procedure if exists pro_name;
delimiter$
create procedure pro_name(in cnt int)
begin
	declare total int default 0;
	lable:loop
		set total = total + 1;
		set cnt = cnt - 1;
		if cnt <= 0 then
			leave lable;
		end if;
	end loop lable;
	select total;
end$

delimiter;
call pro_name(20);

遊標的使用,退出條件是結果集fetch完

drop procedure if exists pro_name;
delimiter$
create procedure pro_name()
begin
	declare cnt smallint default 0;
	declare id int ;
	declare fr_nm varchar(45) default '';
	declare lt_nm varchar(45) default '';
	declare up_tm timestamp;
	declare cur_name cursor for select * from actor;
	select count(*) into cnt from actor;
	-- select cnt;
	open cur_name;
	lable:loop
		fetch  cur_name into id, fr_nm, lt_nm, up_tm;
		select id, fr_nm, lt_nm, up_tm;
		set cnt = cnt - 1;
		if cnt <= 0 then
			leave lable;
		end if;
	end loop lable;
	close cur_name;
end$

delimiter;
call pro_name();

存儲函數
create function fun_name()
returns type
begin
list
return var_nm;
end;

drop function if exists func_nm;
delimiter$
create function func_nm(id int)
returns int
begin
	declare num int default 0;
	select count(*) into num from actor where actor_id=id;
	return num;
end$
delimiter;
select func_nm(2);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章