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);