SQL中的函数与过程(涉及到游标对象的使用)

前言

关系型数据库,也能够使用SQL语句实现函数和过程,但是还是建议不要在数据库中使用函数和过程,因为比较消耗数据库的资源,最好是把这块放在python程序中处理!!!
但是这里还是跟大家分享下SQL语句如何实现函数和过程!

一、函数

sql使用函数需要注意的地方:

  • 默认的代码结束符是“;”,所以写函数前需要修改结束符为其他符号,因为“;”在代码中会使用,不该会冲突,修改结束符的函数时delimiter,用法可看下面的代码。
  • 函数是由返回值的
  • 函数完成后,需要将结束符改回默认值“;
  • 创建函数使用create function命令
  • 使用declare定义变量
    具体函数的创建方法可参考下面的代码,相信大家应该能轻易看懂!!!
-- 将代码结束符从;修改为$$
delimiter $$

create function display_salary_level(sal int) 
returns varchar(10)
begin
	if sal < 4000 then 
		return 'low';
	elseif sal < 7000 then 
		return 'normal';
	else 
		return 'high';
	end if;
end$$

-- 将代码结束符从$$修改为;
delimiter ;

-- 使用函数
select ename, display_salary_level(sal) from tb_emp;

二、过程

SQL使用函数的过程中需要注意的地方:

  • 调用过程的方法为:call +过程名称
  • 过程没有返回值,如果想要获取过程中产生的数据内容,需要在过程中设置输出参数,定义的方法为:out 参数名称 参数类型
  • 给输出参数传参时需要给传一个空的局部变量参数@a,左后输出参数会把结果通过这个参数返回!!
  • 过程也需要修改代码结束吗,使用到的命令也是delimiter
  • 创建过程的的方法为create procedure
  • 逐行获取数据库中表的内容,可以使用游标对象,使用方法类似于python中的迭代器,只不过获取的方式采用变为了fetch,而不是next(下面的第二段代码有涉及到游标的使用)
  • 如果使用到游标,游标对象使用完了要记得关闭
  • 使用declare定义变量
    以下为两个过程的示例:
    第一个示例主要演示如何调用过程和获取过程中的参数
drop procedure sp_avg_sal;
delimiter $$

create procedure sp_avg_sal(
		in dept_no integer,
		out avgsal decimal(10,1)
)
begin
		select avg(sal) into avgsal
		from tb_emp where dno=dept_no;
end$$

delimiter ;

call sp_avg_sal(10,@x);
select @x;

第二个示例主要演示如何使用游标,获取数据表中相关内容:

drop procedure sp_update_sal;
delimiter $$
create procedure sp_update_sal()
begin
	declare emp_no integer;
	declare emp_sal integer;
	declare over boolean default 0;
	declare c cursor for select eno, sal from tb_emp;
	-- 设置结束标志,sql检查到sqlstate为'02000',把结束标记置为1
	declare continue handler for sqlstate '02000' set over=1;
	open c;
	fetch c into emp_no, emp_sal;
	while not over 
	do
		if emp_sal < 3000
		then
				update tb_emp set sal=sal+1000 where eno=emp_no;
		elseif emp_sal <= 5000
		then
				update tb_emp set sal=sal+500 where eno=emp_no;
		else
				update tb_emp set sal=sal-100 where eno=emp_no;
		end if;
		fetch c into emp_no, emp_sal;
	end while;
	--关闭游标
	close c;
end$$

delimiter ;

call sp_update_sal;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值