1、声明包 www.2cto.com
01
createorreplacepackage TAL_TESTis
02
03
— Author : ADMINISTRATOR
04
— Created : 2012/12/9 15:15:38
05
— Purpose : XXXX的测试
06
07
TYPE myCursorTypeISREFCURSOR;
08
09
–测试空游标
10
PROCEDUREp_testEmptyCursor;
11
12
endTAL_TEST;
2、包体
01
createorreplacepackage body TAL_TESTis
02
03
–测试空游标
04
PROCEDUREp_testEmptyCursor
05
IS
06
rowRecord SJ_CD_PERIODS%ROWTYPE;
07
myCursorFirst myCursorType ;
08
myCursorSecond myCursorType;
09
myCursorThird myCursorType;
10
myCursorForth myCursorType;
11
BEGIN
12
–使用notfound(失败) 数据库中不存在限制条件下的数据集 www.2cto.com
13
OPENmyCursorFirstFOR
14
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =1001;
15
IF myCursorFirst%notfoundTHEN
16
dbms_output.put_line(数据库中不存在FPERIODID为1001的数据集);
17
ELSE
18
dbms_output.put_line(数据库中存在FPERIODID为1001的数据库);
19
ENDIF;
20
21
–使用ROWCOUNT(失败)数据库中存在限制条件下的数据集
22
OPENmyCursorSecondFOR
23
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =20112012141202260210001003001002002;
24
IF myCursorSecond%ROWCOUNT = 0THEN
25
dbms_output.put_line(数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集);
26
ELSE
27
dbms_output.put_line(数据库中存在FPERIODID为20112012141202260210001003001002002的数据集);
28
ENDIF;
29
30
–使用FETCH(成功)数据库中存在限制条件下的数据集
31
OPENmyCursorThirdFOR
32
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =20112012141202260210001003001002002;
33
FETCHmyCursorThirdINTOrowRecord;
34
IF myCursorThird%NOTFOUNDTHEN
35
dbms_output.put_line(数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集);
36
ELSE
37
dbms_output.put_line(数据库中存在FPERIODID为20112012141202260210001003001002002的数据集);
38
ENDIF;
39
40
–使用FETCH(成功)数据库中不存在限制条件下的数据集
41
OPENmyCursorForthFOR
42
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =1001;
43
FETCHmyCursorForthINTOrowRecord;
44
IF myCursorForth%NOTFOUNDTHEN
45
dbms_output.put_line(数据库中不存在FPERIODID为1001的数据集);
46
ELSE
47
dbms_output.put_line(数据库中存在FPERIODID为1001的数据集);
48
ENDIF;
49
END;
50
51
endTAL_TEST;
3、下面对上述的测试进行说明
myCursorFirst:
1
–使用notfound(失败) 数据库中不存在限制条件下的数据集
2
OPENmyCursorFirstFOR
3
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =1001;
4
IF myCursorFirst%notfoundTHEN
5
dbms_output.put_line(数据库中不存在FPERIODID为1001的数据集);
6
ELSE
7
dbms_output.put_line(数据库中存在FPERIODID为1001的数据库);
8
ENDIF;
在我的数据库中是不存在编号1001的数据集的。但在调试代码的时候:
程序运行不正确。
说明:其实上述的IF语句就有问题myCursorFirst%notFound肯定为Flase
myCursorSecond:
1
–使用ROWCOUNT(失败)数据库中存在限制条件下的数据集
2
OPENmyCursorSecondFOR
3
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =20112012141202260210001003001002002;
4
IF myCursorSecond%ROWCOUNT = 0THEN
5
dbms_output.put_line(数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集);
6
ELSE
7
dbms_output.put_line(数据库中存在FPERIODID为20112012141202260210001003001002002的数据集);
8
ENDIF;
在我的数据库中是存在上述标号的数据集的。但在调试代码的时候:
程序运行不正确。
说明:当游标不FETCH.%ROWCOUNT属性就一直是0,所以根据这个判断是没有用的。一般都是先Fetch一下,执行完Fetch操作后,再利用%NOTFOUND判断Cursor中有没有数据。于是就有了下面的两个测试。
myCursorThird
1
–使用FETCH(成功)数据库中存在限制条件下的数据集
2
OPENmyCursorThirdFOR
3
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =20112012141202260210001003001002002;
4
FETCHmyCursorThirdINTOrowRecord;
5
IF myCursorThird%NOTFOUNDTHEN
6
dbms_output.put_line(数据库中不存在FPERIODID为20112012141202260210001003001002002的数据集);
7
ELSE
8
dbms_output.put_line(数据库中存在FPERIODID为20112012141202260210001003001002002的数据集);
9
ENDIF;
我的数据库中存在上述的数据集,程序运行的结果为:
程序运行成功。
myCursorForth:
1
–使用FETCH(成功)数据库中不存在限制条件下的数据集
2
OPENmyCursorForthFOR
3
SELECTA.*FROMSJ_CD_PERIODS AWHEREA.FPERIODID =1001;
4
FETCHmyCursorForthINTOrowRecord;
5
IF myCursorForth%NOTFOUNDTHEN
6
dbms_output.put_line(数据库中不存在FPERIODID为1001的数据集);
7
ELSE
8
dbms_output.put_line(数据库中存在FPERIODID为1001的数据集);
9
ENDIF;
我的数据库中不存在1001的数据集。程序运行的结果为:
程序运行正确。
总结:在昨晚和喜姣讨论的时候,我还以为Oracle中有提供直接判断cursor是否为空的函数,今天来在网上搜索了一下,貌似没有。对于cursor来说,只Open,不Fetch的时候,Cursor是不会知道到底有多少数据的。当然你也可以select count(*)……
欢迎指出错误。
参考帖子:http://bbs.csdn.net/topics/370107459