Oracle中判断空游标的方法

转载 2016年08月31日 11:06:36

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(*)......

欢迎指出错误。

参考帖子:http://bbs.csdn.net/topics/370107459

相关文章推荐

oracle中游标详细用法

游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处...

mysql数据库,存储过程中如何判断游标Cursor中结果集是否为空

Mysql 存储过程中如何判断Cursor中结果集是否为空

在PL/SQL中怎样判断查询的结果是否为空

iamlaosong文 在PL/SQL中会经常用到表的查询,然后针对查询结果进行处理。那么怎样判断查询的结果是否为空呢?用count(*)先查一次当然可以,可这样做就会多查询一次,如果仅仅一次倒是无关...

查询数据库返回cursor,如何判断没有符合条件的记录。判断条件不是cursor==null 哦

如题,接着说,如果查询数据库返回cursor,要判断记录是否为空,然后根据结果进行不同的操作。应该如何写判断条件呢? 很简单,用这个函数:cursor.getCount()  。  如果记录为空,该函...

Oracle游标使用方法及语法大全

  • 2012年11月30日 13:13
  • 933KB
  • 下载

Oracle游标使用方法及语法大全

  • 2013年08月17日 16:04
  • 931KB
  • 下载

Oracle的游标使用方法 三种循环

可见for循环是比较简单实用的方法。 首先,它会自动open和close游标。解决了你忘记打开或关闭游标的烦恼。 其它,自动定义了一个记录类型及声明该类型的变量,并自动fetch数据到这个变量中。 我...

Oracle PL/SQL游标的使用方法

--演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭 begin update emp set sal = 1000; dbms_output.put_...

Oracle中清除游标缓存的几种方法

9i以后引入了bind peeking绑定变量窥视特性,但该特性常有帮当忙之嫌,所以有了11g的自适应游标特性。排除因绑定变量窥视造成的因素外,统计信息讹误也会造成执行计划偏差,这时我们就可能需要清除...
  • halou90
  • halou90
  • 2015年11月11日 16:39
  • 466

ibatis调用oracle的函数、存储过程的方法 in和out游标

1对于全部是in 类型的参数过程,采用下面的方法调用(ibatis版本是2.3) 比如过程:     Procedure Flashback_Op(v_table_owner Varcha...
  • sprita1
  • sprita1
  • 2012年04月17日 00:19
  • 3323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle中判断空游标的方法
举报原因:
原因补充:

(最多只允许输入30个字)