声明:本文是在看完一个帖子,经过自己测试验证后得出来的一些结论,如果大家有更好的解决办法,可以留言,如有错误请指出。谢谢~
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(*)......
欢迎指出错误。
参考帖子: