前言
关系型数据库,也能够使用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;