博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle中判断空游标的方法
阅读量:6067 次
发布时间:2019-06-20

本文共 4193 字,大约阅读时间需要 13 分钟。

hot3.png

声明:本文是在看完一个帖子,经过自己测试验证后得出来的一些结论,如果大家有更好的解决办法,可以留言,如有错误请指出。谢谢~

1、声明包

create or replace package TAL_TEST is  -- Author  : ADMINISTRATOR  -- Created : 2012/12/9 15:15:38  -- Purpose : XXXX的测试   TYPE myCursorType IS REF CURSOR;  --测试空游标 PROCEDURE p_testEmptyCursor; end TAL_TEST;

2、包体

create or replace package body TAL_TEST is --测试空游标 PROCEDURE p_testEmptyCursor   IS   rowRecord SJ_CD_PERIODS%ROWTYPE;   myCursorFirst myCursorType ;   myCursorSecond myCursorType;   myCursorThird myCursorType;   myCursorForth myCursorType;   BEGIN      --使用notfound(失败) 数据库中不存在限制条件下的数据集       OPEN myCursorFirst FOR     SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001' ;     IF myCursorFirst%notfound THEN       dbms_output.put_line('数据库中不存在FPERIODID为1001的数据集');       ELSE         dbms_output.put_line('数据库中存在FPERIODID为1001的数据库');         END IF;          --使用ROWCOUNT(失败)数据库中存在限制条件下的数据集     OPEN myCursorSecond FOR     SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';     IF myCursorSecond%ROWCOUNT = 0 THEN        dbms_output.put_line('数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集');       ELSE         dbms_output.put_line('数据库中存在FPERIODID为20112012141202260210001003001002002的数据集');         END IF;               --使用FETCH(成功)数据库中存在限制条件下的数据集      OPEN myCursorThird FOR      SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';      FETCH myCursorThird INTO rowRecord;        IF myCursorThird%NOTFOUND THEN         dbms_output.put_line('数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集');         ELSE           dbms_output.put_line('数据库中存在FPERIODID为20112012141202260210001003001002002的数据集');           END IF;            --使用FETCH(成功)数据库中不存在限制条件下的数据集      OPEN myCursorForth FOR      SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001';      FETCH myCursorForth INTO rowRecord;        IF myCursorForth%NOTFOUND THEN         dbms_output.put_line('数据库中不存在FPERIODID为1001的数据集');         ELSE           dbms_output.put_line('数据库中存在FPERIODID为1001的数据集');           END IF;               END;     end TAL_TEST;

3、下面对上述的测试进行说明

myCursorFirst:

--使用notfound(失败) 数据库中不存在限制条件下的数据集       OPEN myCursorFirst FOR     SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001' ;     IF myCursorFirst%notfound THEN       dbms_output.put_line('数据库中不存在FPERIODID为1001的数据集');       ELSE         dbms_output.put_line('数据库中存在FPERIODID为1001的数据库');         END IF;

在我的数据库中是不存在编号'1001'的数据集的。但在调试代码的时候:

程序运行不正确。

说明:其实上述的IF语句就有问题myCursorFirst%notFound肯定为Flase

myCursorSecond:

--使用ROWCOUNT(失败)数据库中存在限制条件下的数据集     OPEN myCursorSecond FOR     SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';     IF myCursorSecond%ROWCOUNT = 0 THEN        dbms_output.put_line('数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集');       ELSE         dbms_output.put_line('数据库中存在FPERIODID为20112012141202260210001003001002002的数据集');         END IF;

在我的数据库中是存在上述标号的数据集的。但在调试代码的时候:

程序运行不正确。

说明:当游标不FETCH.%ROWCOUNT属性就一直是0,所以根据这个判断是没有用的。一般都是先Fetch一下,执行完Fetch操作后,再利用%NOTFOUND判断Cursor中有没有数据。于是就有了下面的两个测试。

myCursorThird

--使用FETCH(成功)数据库中存在限制条件下的数据集      OPEN myCursorThird FOR      SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';      FETCH myCursorThird INTO rowRecord;        IF myCursorThird%NOTFOUND THEN         dbms_output.put_line('数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集');         ELSE           dbms_output.put_line('数据库中存在FPERIODID为20112012141202260210001003001002002的数据集');           END IF;

我的数据库中存在上述的数据集,程序运行的结果为:

程序运行成功。

myCursorForth:

--使用FETCH(成功)数据库中不存在限制条件下的数据集      OPEN myCursorForth FOR      SELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001';      FETCH myCursorForth INTO rowRecord;        IF myCursorForth%NOTFOUND THEN         dbms_output.put_line('数据库中不存在FPERIODID为1001的数据集');         ELSE           dbms_output.put_line('数据库中存在FPERIODID为1001的数据集');           END IF;

我的数据库中不存在1001的数据集。程序运行的结果为:

程序运行正确。

总结:在昨晚和喜姣讨论的时候,我还以为Oracle中有提供直接判断cursor是否为空的函数,今天来在网上搜索了一下,貌似没有。对于cursor来说,只Open,不Fetch的时候,Cursor是不会知道到底有多少数据的。当然你也可以select count(*)......

欢迎指出错误。

参考帖子:

 

 

 

 

转载于:https://my.oschina.net/eillenme/blog/94759

你可能感兴趣的文章
多线程并发知识精要
查看>>
「翻译」逐步替换Sass
查看>>
SharePoint 2010 几个小工具
查看>>
apiDoc生成接口文档,不费吹灰之力
查看>>
GlusterFS 安装 on centos7
查看>>
mysql存储引擎(mysql学习六)
查看>>
服务器CPU负载过高问题查询记录
查看>>
H5实现全屏与F11全屏
查看>>
keytool工具
查看>>
web测试知识点整理
查看>>
软件工程的实践项目课程的自我目标
查看>>
Redis在CentOS和Windows安装过程
查看>>
动态规划_连续子数组的最大和
查看>>
《Python核心编程》第二版第六章练习题答案-第四部分
查看>>
Apache通用日志工具commons-logging和Log4j使用总结
查看>>
3.阿里巴巴dubbo分布式rpc框架详细使用教程
查看>>
12.浏览器测试
查看>>
【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
查看>>
1136: 零起点学算法43——多组测试数据输出I
查看>>
maven依赖本地非repository中的jar包【转】
查看>>