iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQL中的游标、异常处理、存储函数及总结(最新推荐)
  • 239
分享到

SQL中的游标、异常处理、存储函数及总结(最新推荐)

SQL中的游标SQL异常处理SQL存储函数 2023-02-16 09:02:33 239人浏览 八月长安
摘要

目录一.游标格式操作 演示二.异常处理—handler句柄格式 演示 三.存储函数格式 参数说明演示四.存储过程总结一.游标 游标

一.游标

游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和 CLOSE.

格式

操作

 演示

use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc21(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	fetch my_cursor into var_empno,var_ename,var_sal;
	select var_empno,var_ename,var_sal;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;
 
call proc21('销售部');

运行输出的结果是

但是

 我们发现符合要求的有多个值,这是因为游标是一条条往下执行的所以我们可以用一个循环

use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc21(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	label:loop
	fetch my_cursor into var_empno,var_ename,var_sal;
	select var_empno,var_ename,var_sal;
	end loop label;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;
 
call proc21('销售部');

 结果会报错

No data - zero rows fetched, selected, or processed 这句话意思是没有数据 零行 读取 选择或处理,就是说循环到最后没值了,所以我们需要找到一个条件并及时退出循环,这就需要异常处理—handler句柄。

二.异常处理—handler句柄

格式

 注意

在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。

--定义句柄:定义异常的处理方式

1:异常处理完之后程序该怎么执行
        continue :继续执行剩余代码

        exit :直接终止程序
        undo:不支持
2:触发条件

条件码:1329

条件名:
        sqlWARNING

        NOT FOUND

        SQLEXCEPTioN

 演示

-- 用条件名
use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc22(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);
 
	-- 定义标记值
	declare flag int default 1;
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 定义句柄,当数据未发现时将标记位设置为0
	declare continue handler for  not found set flag=0;
 
	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	label:loop
	fetch my_cursor into var_empno,var_ename,var_sal;
	if flag=1 then
		select var_empno,var_ename,var_sal;
	else
		leave label;
	end if;
	end loop label;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;
 
call proc22('销售部');
 
 
 
-- 用条件码
use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc23(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);
 
	-- 定义标记值
	declare flag int default 1;
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 定义句柄,当数据未发现时将标记位设置为0
	declare continue handler for  1329 set flag=0;
 
	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	label:loop
	fetch my_cursor into var_empno,var_ename,var_sal;
	if flag=1 then
		select var_empno,var_ename,var_sal;
	else
		leave label;
	end if;
	end loop label;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;
 
call proc23('销售部');

两个的运行结果是一样的

 三.存储函数

格式

Mysql中,创建存储函数使用create function关键字,其基本形式如下:

 参数说明

(1) func_name :存储函数的名称。
(2) param_name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是mysql数据库中所有支持的类型。
(3)returns type:指定返回值的类型。
(4)characteristic:可选项,指定存储函数的特性。
(5)routine_body: SQL代码内容。

演示

drop function if exists myfunc1_emp;
delimiter $$
create function myfunc1_emp() returns int
begin
	declare cnt int default 0;
	select count(*) into cnt from emp;
	return cnt;
end $$
delimiter ;

运行结果可以会报错,像这样

 意思是说“此函数在其声明中没有确定性、无 SQL 或读取 SQL 数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的 log_bin_trust_function_creators 变量)”

所以我们设置允许创建函数权限信任即可

-- 允许创建函数权限信任
set global log_bin_trust_function_creators=true ;

-- 允许创建函数权限信任
set global log_bin_trust_function_creators=true ;
 
drop function if exists myfunc1_emp;
delimiter $$
create function myfunc1_emp() returns int
begin
	declare cnt int default 0;
	select count(*) into cnt from emp;
	return cnt;
end $$
delimiter ;
 
-- 调用存储函数
select myfunc1_emp();

 这样就可以了

四.存储过程总结

到此这篇关于SQL中的游标、异常处理、存储函数及总结的文章就介绍到这了,更多相关SQL中的游标、异常处理、存储函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SQL中的游标、异常处理、存储函数及总结(最新推荐)

本文链接: https://www.lsjlt.com/news/196323.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作