文档中的解释:It returns TRUE
if an INSERT
, UPDATE
, or DELETE
statement affected no rows, or a SELECT
INTO
statement returned no rows. Otherwise, it returns FALSE
.
这个解释更加精妙:%NOTFOUND
is the logical opposite of %FOUND
. %NOTFOUND
yields FALSE
if the last fetch returned a row, or TRUE
if the last fetch failed to return a row
错误的例子:
tableA
id name
1 a
2 b
declare
cursor v_cur is select name from tableA;
n varchar2(10);
begin
open v_cur;
loop
exit when v_cur%notfound;
fetch v_cur into n;
dbms_output.put_line(n);
close v_cur;
end loop;
end;
执行上面的语句,结果为:
a
b
b
发现最后一条记录被打印了两次。原因是%notfound是判断最后一次fetch的结果,把bfetch到变量n中之后再执行exit when %notfound判断得到的是false的记过,也就是说是有返回行的,所以判断通过,再此执行了打印语句。
发现了另一个疑问:
把a,b都fetch之后按理说游标已经空了,那么第三次应该是fetch的空值,为什么打印出来的还是b呢??
因为fetch..into语句末尾不会修改into变量后面的值。就像select..into如果没有数据会报异常,但是不会把into后面的变量置为空
再写一段代码
declare
cursor v_cur is select name from tableA where name = 'c';
n varchar2(10);
begin
open v_cur;
loop
exit when v_cur%notfound;
n:='hehe'
fetch v_cur into n;
dbms_output.put_line(n);
close v_cur;
end loop;
end;
执行代码的结果:
hehe
疑问:游标是空游标,也就是说游标在打开的时候就没有指向任何的值。但为什么
exit when v_cur%notfound;这条语句还通过了呢??
oracle文档的解释:
Before the first fetch, %NOTFOUND
returns NULL
. If FETCH
never executes successfully, the loop is never exited, because the EXIT
WHEN
statement executes only if its WHEN
condition is true. To be safe, you might want to use the following EXIT
statement instead:
EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;
也就是说v_cur%notfound有三种状态,true,false,null。所以以后为了安全期间可以加上是否为空的判断
相关推荐
在本篇讨论中,我们将深入理解Oracle游标、异常处理以及如何在存储过程中使用它们。 1. **Oracle游标**: - **定义**:Oracle游标是数据库系统提供的一种机制,用于在结果集中定位并处理单条记录。它实际上是一个...
### Oracle存储过程实例详解 #### 一、存储过程概述 Oracle 存储过程是一种数据库对象,可以在数据库服务器上编译并执行预定义的 SQL 语句或 PL/SQL 代码块。通过创建存储过程,可以实现更高效的数据处理、逻辑...
### Oracle内部培训资料——游标知识点详解 #### 一、游标概述 游标是Oracle数据库中用于处理SQL查询返回的多行记录的一种机制。它允许用户逐行地访问查询结果,这对于处理不确定数量的数据非常有用。游标分为两种...
阅读提供的文档如《Oracle+PLSQL语言入门》、《Oracle数据库PL-SQL学习资料之五——异常处理》和《oracle存储过程中的异常处理》,可以进一步深入学习这些概念并提升您的Oracle数据库编程技能。
EXIT WHEN tt_test%NOTFOUND; END; END LOOP; ``` 4. **返回结果**:最后,函数返回变量`Result`的值。 #### 总结 此Oracle函数`NS_DNAF_GetPaidUpDeposit`主要功能是从指定表中查询客户的账户余额,并返回这...
11. **游标**:游标用于处理SQL查询结果集,有OPEN、FETCH、CLOSE等步骤,其四个主要属性是%ISOPEN、%FOUND、%NOTFOUND和%ROWCOUNT。 12. **数据导入导出**:Oracle提供了IMP和EXP工具进行数据导入和导出,或者使用...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是Oracle数据库中一种特定的函数——先查询后更新的功能,这种功能适用于单表和多表的情况。接下来将详细阐述这一知识点。 ### 一、先查询...
EXIT WHEN CV%NOTFOUND; END LOOP; CLOSE CV; END; / GRANT EXECUTE ON GET_OWNER TO PUBLIC; ``` 在这个示例中,`GET_OWNER`存储过程接受一个参数`P_OBJNM`,并使用该参数构建一个查询语句,以获取指定对象的...
在安装Oracle9i的过程中,可能会遇到一个警告信息:“File not found D: \oracle\ora92\ocs4j\admin\OCS4J.properties”。虽然用户可以选择忽略此警告并继续完成安装,但这一提示可能会让用户担忧是否会对后续操作或...
EXIT WHEN c_employees%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_employee.first_name); END LOOP; CLOSE c_employees; END; ``` #### 总结 通过深入学习Oracle 10g的PL/SQL编程,开发者不仅可以提高数据库应用的...
### 韩顺平玩转Oracle学习笔记知识点详解 #### 一、Oracle基本使用——基本命令 ##### 连接命令 - **`conn[ect]`**:此命令用于连接到Oracle数据库。语法如下: - `conn 用户名/密码@网络服务名 [as sysdba/...
`FETCH`语句将游标当前行的数据赋值给变量,`%NOTFOUND`条件检查是否还有更多行可读。 **隐式游标** 是由Oracle自动处理的,无需显式声明。每当执行一个DML语句(如INSERT、UPDATE或DELETE)时,系统会自动创建一个...
- `%NOTFOUND`: 判断是否已经到达查询结果的末尾。 ##### 13.5 遍历循环游标 遍历游标中的每一行数据: ```sql DECLARE CURSOR cur_name IS SELECT * FROM table_name; v_row cur_name%ROWTYPE; BEGIN OPEN cur...
### Oracle 教学知识点梳理 —— 事务、过程、触发器等高级特性 #### 一、事务基础 **事务**是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么全部执行成功,要么全部不执行。...
EXIT WHEN c_emp%NOTFOUND; IF v_emp.deptno = 10 THEN v_emp.sal := v_emp.sal * 1.1; -- 提升10% ELSIF v_emp.deptno = 20 THEN v_emp.sal := v_emp.sal * 1.15; -- 提升15% ELSE v_emp.sal := v_emp.sal *...
EXIT WHEN cursor_name%NOTFOUND; -- 处理数据 END LOOP; CLOSE cursor_name; END; ``` 6. **过程和函数**:过程是一组PL/SQL语句,可以有参数但不返回值;函数也是一组PL/SQL语句,但返回一个值。它们可以...
简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...
2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...
- 类型: Oracle支持三种类型的集合——`TABLE`, `LIST`, `VARRAY`。 - 示例: `TYPE Emp_Table IS TABLE OF NUMBER INDEX BY PLS_INTEGER;` #### 三、单行函数与组函数 - **单行函数**: - 定义: 返回单一值的函数...