Oracle中判断空游标的方法
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |