关闭

Oracle中判断空游标的方法

1105人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:40687次
    • 积分:747
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:64篇
    • 译文:0篇
    • 评论:2条