使用mysql编写存储过程的使用方法

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值