oracle 数据库中的异常和游标管理
异常和游标管理
游标:
 用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。
分类:
 静态游标:
 分为显式游标和隐式游标。
 REF游标:
 是一种引用类型,类似于指针。
显式游标:
 CURSOR 游标名 ( 参数 ) [返回值类型] IS
 Select 语句
生命周期:
 1.打开游标(OPEN):
 解析,绑定。。。不会从数据库检索数据
 2.从游标中获取记录(FETCH INTO):
 执行查询,返回结果集。通常定义局域变量作为从游标获取数据的缓冲区。
 3.关闭游标(CLOSE)
 完成游标处理,用户不能从游标中获取行。还可以重新打开。
选项:参数和返回类型
set serveroutput on
 declare
 cursor emp_cur ( p_deptid in number) is
 select * from employees where department_id = p_deptid;
l_emp employees%rowtype;
 begin
 dbms_output.put_line(‘Getting employees from department 30’);
 open emp_cur(30);
 loop
 fetch emp_cur into l_emp;
 exit when emp_cur%notfound;
 dbms_output.put_line(‘Employee id ‘|| l_emp.employee_id || ‘ is ‘);
 dbms_output.put_line(l_emp.first_name || ‘ ‘ || l_emp.last_name);
 end loop;
 close emp_cur;
dbms_output.put_line(‘Getting employees from department 90’);
open emp_cur(90);
 loop
 fetch emp_cur into l_emp;
 exit when emp_cur%notfound;
 dbms_output.put_line(‘Employee id ‘|| l_emp.employee_id || ‘ is ‘);
 dbms_output.put_line(l_emp.first_name || ‘ ‘ || l_emp.last_name);
 end loop;
 close emp_cur;
 end;
 /
隐式游标:
 不用明确建立游标变量,分两种:
 1.在PL/SQL中使用DML语言,使用ORACLE提供的名为SQL的隐示游标
 2.CURSOR FOR LOOP,用于for loop 语句。
1举例:
 declare
 begin
 update departments set department_name=department_name;
 –where 1=2;
dbms_output.put_line(‘update ‘|| sql%rowcount ||’ records’);
end;
 /
2举例:
 declare
 begin
 for my_dept_rec in ( select department_name, department_id from departments)
 loop
 dbms_output.put_line(my_dept_rec.department_id || ‘ : ’ || my_dept_rec.department_name);
 end loop;
 end;
 /
游标属性:
 %FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。
 %NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。
 %ROWCOUNT:当前时刻已经从游标中获取的记录数量。
 %ISOPEN:是否打开。
Declare
 Cursor emps is
 Select * from employees where rownum<6 order by 1;
Emp employees%rowtype;
Row number :=1;
Begin
 Open emps;
 Fetch emps into emp;
LoopIf emps%found thenDbms_output.put_line(‘Looping over record ‘||row|| ‘ of ‘ || emps%rowcount);Fetch emps into emp;Row := row + 1;Elsif emps%notfound thenExit;  ---exit loop, not IFEnd if;
End loop;If emps%isopen thenClose emps;
End if;
End;
 /
显式和隐式游标的区别:
 尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。
REF CURSOR游标:
 动态游标,在运行的时候才能确定游标使用的查询。分类:
 强类型(限制)REF CURSOR,规定返回类型
 弱类型(非限制)REF CURSOR,不规定返回类型,可以获取任何结果集。
TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]
Declare
 Type refcur_t is ref cursor;
Type emp_refcur_t is ref cursor return employee%rowtype;
Begin
 Null;
 End;
 /
强类型举例:
 declare
 –声明记录类型
 type emp_job_rec is record(
 employee_id number,
 employee_name varchar2(50),
 job_title varchar2(30)
 );
 –声明REF CURSOR,返回值为该记录类型
 type emp_job_refcur_type is ref cursor
 return emp_job_rec;
 –定义REF CURSOR游标的变量
 emp_refcur emp_job_refcur_type;
emp_job emp_job_rec;
begin
 open emp_refcur for
 select e.employee_id,
 e.first_name || ‘ ’ ||e.last_name “employee_name”,
 j.job_title
 from employees e, jobs j
 where e.job_id = j.job_id and rownum < 11 order by 1;
fetch emp_refcur into emp_job;
while emp_refcur%found loopdbms_output.put_line(emp_job.employee_name || ‘’’s job is ’);dbms_output.put_line(emp_job.job_title);fetch emp_refcur into emp_job;
end loop;
end;
 /
单独select
declare
 l_empno emp.EMPLOYEE_ID%type;
 – l_ename emp.ename%type;
 begin
 select EMPLOYEE_ID
 into l_empno
 from emp;
 –where rownum =1;
 dbms_output.put_line(l_empno);
 end;
 /
 使用INTO获取值,只能返回一行。
错误处理:
 exception
 when <exception_expression> then
 …
 when <exception_expression> then
 …
 end;
exception_expression包括:
 1.预定义表达式
 2.用户定义表达式
 3.PRAGMA EXCEPTION_INIT
预定义
 declare
 l_dept departments%rowtype;
 begin
 l_dept.department_id:=100;
 l_dept.department_name:=’HR’;
 insert into departments(department_id, department_name)
 values(l_dept.department_id, l_dept.department_name);
 Exception
 When DUP_VAL_ON_INDEX then
 Dbms_output.put_line(‘heihei’);
 end;
 /
DUP_VAL_ON_INDEX 异常
Exception
 When DUP_VAL_ON_INDEX then
 Dbms_output.put_line……
自定义:
 declare
 l_exc exception;
 begin
 …
 raise l_exc;
 exception
 when l_exc then
 …
 end;
 /
PRAGMA EXCEPTION_INIT
Declare
 L_update_text varchar2(100):=
 ‘update &table_name set &updated_column_name= ‘’:a’’
 where &key_column_name=:a’;
 begin
 execute immediate L_update_text using ‘&updated_column_value’, &key_column_value;
 end;
 /
Declare
 Invalid_column_name exception;
 Pragma exception_init(Invalid_column_name,-904);
L_update_text varchar2(100):=‘update &table_name set &updated_column_name= ‘’:a’’where &key_column_name=:a’;
begin
 execute immediate L_update_text using ‘&updated_column_value’, &key_column_value;
exception
 when Invalid_column_name then
 dbms_output.put_line(‘hehe’);
 end;
 /
异常传播:
 begin
 begin
 begin
 begin
 begin
 declare
 fname employees.first_name%type;
 begin
 select first_name into fname from employees where 1=2;
 –exception
 –when NO_DATA_FOUND then
 – dbms_output.put_line(‘block 6’);
 end;
 exception
 when NO_DATA_FOUND then
 dbms_output.put_line(‘block 5’);
 end;
 exception
 when NO_DATA_FOUND then
 dbms_output.put_line(‘block 4’);
 end;
 exception
 when NO_DATA_FOUND then
 dbms_output.put_line(‘block 3’);
 end;
 exception
 when NO_DATA_FOUND then
 dbms_output.put_line(‘block 2’);
 end;
 exception
 when NO_DATA_FOUND then
 dbms_output.put_line(‘block 1’);
 end;
 /
作用域和可视性:
 begin
 declare
 nested_excp exception;
 begin
 raise nested_excp;
 end;
 exception
 when nested_excp then
 dbms_output.put_line(‘haha’);
 end;
 /
when others then
 放在最后
begin
 declare
 nested_excp exception;
 begin
 raise nested_excp;
 end;
 exception
 when others then
 dbms_output.put_line(‘haha’);
 dbms_output.put_line(sqlcode || ‘ is ’ || sqlerrm);
raise;
end;
 /
SQLCODE SQLERRM
declare
 l_dept departments%rowtype;
 begin
 l_dept.department_id:=100;
 l_dept.department_name:=’HR’;
 insert into departments(department_id, department_name)
 values(l_dept.department_id, l_dept.department_name);
 Exception
 When others then
 dbms_output.put_line(sqlcode || ‘ is ’ || sqlerrm);
 end;
 /
 declare
 l_dept departments%rowtype;
 begin
 l_dept.department_id:=100;
 l_dept.department_name:=’HR’;
 insert into departments(department_id, department_name)
 values(l_dept.department_id, l_dept.department_name);
 Exception
 When others then
 Raise_application_error(-20001, ‘error message!’);
 End;
 /
相关文章:
oracle 数据库中的异常和游标管理
异常和游标管理 游标: 用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。 分类: 静态游标: 分为显式游标和隐式游标。 REF游标&…...
关于python 日志设定为INFO 但是DEBUG仍旧写入的问题
问题:将logging设定为了INFO级别,但是在打印的时候发现jieba包中的DEBUG级别的信息还是出现了。 原因:在我引用的包中,一些python文件也使用了logging,我设定的INFO级别只能设定我当前使用的文件,而调用的包…...
TypeScript 语法基础 第一部分 类型
【视频链接】尚硅谷TypeScript教程(李立超老师TS新课) TypeScript TypeScript 语法基础 第二部分 类、接口、泛型1. 类型1.1 | 联合类型1.2 字面量类型1.3 any 任意类型1.4 unkown 类型1.5 as 类型断言1.6 object 对象类型1.7 { } 对象类型1.8 ÿ…...
GO Serial 学习与使用
文章目录 主要特性安装基本用法配置选项错误处理其他功能 github.com/goburrow/serial 是一个 Go 包,提供了一种简单的方式来与串口进行交互。以下是该包的主要特性和用法的简要概述: 主要特性 跨平台支持:支持 Windows、macOS 和 Linux。简…...
安卓app开发系列之-常用工具与库
✨ 关于我 ✨ 👨💻 Hi there! 我是 [Jamson],一名热爱编程与技术的狂热者,致力于前后端的全栈独立软件系统开发。通过不断学习和实践,我希望将知识分享给更多的朋友们,和大家一起成长。 💡 &…...
 
视频汇聚EasyCVR视频监控平台调取接口提示“认证过期”是什么原因?
视频汇聚EasyCVR视频监控平台,作为一款智能视频监控综合管理平台,凭借其强大的视频融合汇聚能力和灵活的视频能力,在各行各业的应用中发挥着越来越重要的作用。EasyCVR平台具备强大的拓展性和灵活性,支持多种视频流的外部分发&…...
uniapp视频禁止用户推拽进度条并保留进度条显示的解决方法——方案二
在uniapp项目中,使用<video>组件播放视频非常方便。默认情况下,视频组件会显示进度条,用户可以随意拖动进度条来控制视频播放进度。然而,在某些特定场景,如在线教育、广告宣传等,我们希望禁止用户拖动…...
 
mysql复合查询 -- 多表查询(介绍,笛卡尔积,使用),自连接(介绍,使用)
目录 多表查询 介绍 使用 表数据 显示雇员名,雇员工资,以及所在部门名 显示部门号为10的部门名,员工名,工资 自连接 介绍 场景 表数据 题目 子查询 自连接 多表查询 介绍 实际开发中往往数据来自不同的表,所以需要多表查询 语法: from 表1,表2 (笛卡…...
【个人笔记】数据一致性的解决方案
保证数据一致性:指保证redis里的数据和mysql的数据是一致的,不能说mysql更新了,但redis里面的还是旧的数据,反之亦然 先说结论:增删改的时候,把Redis中的缓存删了 为什么不先更新数据库,再更新…...
【WPF】多屏幕展示
使用环境为.Net Framework,如果有.Net 6的解决方案,欢迎交流。 话不多说,先上代码! /// <summary>/// Window窗口展示设置/// </summary>/// <param name"monitor"></param>/// <param nam…...
vue admin 若依框架 解决无权限时进入死循环的问题 auths
核心原因: if (auths && auths.length > 0) { // like12 find bug,数组为空[]时依然会进入死循环 原来为:if (auths) // 获取用户信息getInfo({ commit, state }) {return new Promise((resolve, reject) > {getInfo(state.token).then(…...
 
kubernetes存储入门(kubernetes)
实验环境依旧是三个节点拉取镜像,然后在master节点拉取资源清单: 然后同步会话,导入镜像; 存储入门 ConfigMap volume卷--》volumemount(挂载卷) Glusterfs NFS ISCSI HostPath ConfigMap Secret E…...
局部代理有什么好处?为什么不使用全局代理?
1. 什么是局部代理与全局代理? 局部代理:局部代理只会对特定应用程序或特定的网络流量进行代理,而不会影响其他网络流量。例如,你可以设置浏览器使用代理,而其他应用程序如邮件客户端或游戏仍然使用本地网络连接。 全…...
ssm模糊知识点整合
一、参数绑定常用注解 RequestParam:用于将请求参数绑定到你的方法参数上。 PathVariable:用于将路径变量绑定到你的方法参数上。 RequestBody:用于将请求主体绑定到你的方法参数上,通常用于绑定POST请求的JSON或XML数据。 Req…...
 
2、Spring Boot 3.x 集成 Feign
一、前言 本篇主要是围绕着两个点,1、集成 Feign,2、分离feign接口层,独立服务; 还有一点就是上篇文章的服务 iot-channel、system-server 服务名称调整成为了 chain-iot-channel、chain-system二、搭建 chain-common 服务 pom.…...
 
深度学习-图像处理篇-5ResNet和ResNeXt
解决问题: 梯度消失或梯度爆炸 退化问题(degradation problem) 迁移学习 ResNeXt...
类的关联、依赖、聚合和组合关系的思考(一)
最近在看《设计模式》这本书,发现对类之间的关系还没搞的很明白,而类之间的关系对读书、阅读代码和代码设计都非常重要,因此边看书边查阅了一些资料,感觉有些理解了。下面是我的一些思考,分享一下。 查阅了很多博客&a…...
 
云舟观测:集成开源Grafana Faro构建前端页面性能监控平台
在当今互联网时代,面对纷乱繁杂的网上资源,用户的耐心和注意力是极为宝贵的资源,当用户访问一个网站或应用时,他们期望的是快速且无缝的体验,任何加载延迟或功能故障都可能导致用户流失,影响品牌体验。因此…...
 
c# 子类继承父类接口问题
在C#中,子类并不直接“继承”父类继承的接口,但子类的确会继承父类对接口的实现(如果父类实现了该接口)。这里有一些关键的概念需要澄清: 接口继承:当一个类实现了某个接口时,它必须实现接口中…...
Vue 中自定义指令的探索与实践
文章目录 一、Vue 自定义指令简介二、基本语法三、指令的值四、封装v-loading指令五、总结 在 Vue 开发中,自定义指令为我们提供了一种强大的方式来操作 DOM 元素,实现特定的交互效果和功能增强。本文将深入探讨 Vue 中自定义指令的基本语法、指令的值的…...
 
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
 
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
 
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
 
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
 
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
 
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
 
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
