1.创建存储过程
①创建无参存储过程。
create procedure P_CP()
begin
select * from user;
end;
调用无参存储过程: call P_CP()
在mybatis中调用存储过程: {call P_CP()}
②创建有参
CREATE PROCEDURE P_CP(in p_unitid varchar(20), out p_result int)
begin
declare p_bbdw varchar(20);
declare p_lydjbh varchar(40);
end;``
调用有参存储过程: call procedure2(@p_unitid ,@p_result);
在mybatis中调用存储过程: {call P_CP(#{p_unitid,jdbcType=VARCHAR,mode=IN},#{p_result ,jdbcType=INTEGER,mode=OUT})}
ps:包含两个参数 in、out
in: 一个是传入参数;
out: 一个是传出参数;
调用此存储过程 , 必须指定2个变量名(所有 MySql 变量都必须以 @ 开始)
③删除存储过程
drop procedure product;
drop procedure if exists GetUsers;
2.一个完整的存储过程
--判断是否存在改名称的存储过程, 如果存在则删除该存储过程
drop procedure if exists P_存储过程名称;
--创建存储过程(in: 传入的参数; out: 返回的参数)
CREATE PROCEDURE P_存储过程名称(in p_unitid varchar(20), out p_result int)
--开始
begin
/*为p_bbdw声明变量*/
declare p_bbdw varchar(20);
declare p_lydjbh varchar(40);
declare p_htbh varchar(40);
declare p_hpbh varchar(40);
declare p_sl numeric(14,4);
declare has_next int default 1;
/*cursor: 为rowpointer定义游标
open rowpointer : 开启游标*/
declare rowpointer cursor for
select distinct mx.bbdw, sc.htbh, mx.wlbh, sum(mx.rksl) as sl
from kc_ccprkd_mx mx, kc_ccprkd rk, sc_scgl sc
where mx.bbdw=rk.bbdw and mx.rkdbh=rk.bh and rk.bbdw=sc.bbdw and rk.lydjbh=sc.scbh
and ifnull(mx.delflg,'')<>'1' and ifnull(rk.delflg,'')<>'1' and ifnull(sc.delflg,'')<>'1' and rk.shzt='1' and rk.djly='sczl'
and rk.bbdw=p_unitid and rk.bh=p_ccprkbh
group by mx.bbdw, sc.htbh, mx.wlbh ;
/*如果没有返回值, 则设置has_next=0*/
declare continue handler for NOT FOUND set has_next=0;
/*if not exists 即如果不存在,if exists 即如果存在*/
if exists (
select mx.autoid
from kc_ccprkd_mx mx, kc_ccprkd rk, sc_scgl sc
where mx.bbdw=rk.bbdw and mx.rkdbh=rk.bh and rk.bbdw=sc.bbdw and rk.lydjbh=sc.scbh
and ifnull(mx.delflg,'')<>'1' and ifnull(rk.delflg,'')<>'1' and ifnull(sc.delflg,'')<>'1' and rk.shzt='1' and rk.djly='sczl'
and rk.bbdw=p_unitid and rk.bh=p_ccprkbh
) then
set p_result=0;
/* 开启游标 */
open rowpointer;
/*返回一个字符串组成的字符串STR重复的次数。如果计数小于1,则返回一个空字符串。如果str或count是NULL,则返回NULL。*/
repeat
/*提取操作的列数据放到局部变量中*/
fetch rowpointer into p_bbdw, p_htbh, p_hpbh, p_sl;
if has_next!=0 then
update ht_ht_cp set rksl=ifnull(rksl,0)+p_sl where htbh=p_htbh and cpbh=p_hpbh and ifnull(delflg,'')<>'1';
set p_result=p_result+1;
end if;
until has_next=0 end repeat;
/*关闭游标*/
close rowpointer;
else
set p_result=0;
end if;
end;