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://www.f2er.com/oracle/212855.html