Oracle中判断空游标的方法

转载 2016年08月31日 11:06:36

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

oracle触发器中判断记录是否为空

我开始写了一个触发器,要判断SSO_SP_LIST表中MASTER_SESS_ID字段值与我要在SSO_MASTERS_INF表中删除的记录的MASTER_SESS_ID字段值相等的记录是否为空,我s...
  • samara
  • samara
  • 2005年11月05日 12:35
  • 6318

mysql数据库,存储过程中如何判断游标Cursor中结果集是否为空

Mysql 存储过程中如何判断Cursor中结果集是否为空
  • caodongfang126
  • caodongfang126
  • 2016年09月20日 16:47
  • 3811

Oracle中判断空游标的方法

1、声明包 create or replace package TAL_TEST is -- Author : ADMINISTRATOR -- Created : 2012/12/9 ...
  • wtxwd
  • wtxwd
  • 2016年08月31日 11:06
  • 1681

Oracle游标大全

1.Oracle游标大全     SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的返回值被赋予INTO子句中的变量,变量的声明是在DE...
  • ansy
  • ansy
  • 2006年05月15日 10:28
  • 13512

Oracle: ORA-01000: 超出打开游标的最大数问题及解决办法

java.sql.SQLException: ORA-01000: 超出打开游标的最大数ORA-01000: 超出打开游标的最大数ORA-06512: 在"SYS.DBMS_LOB", line 52...
  • shenzhen_mydream
  • shenzhen_mydream
  • 2010年07月11日 14:19
  • 19547

游标的概念和作用

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存放...
  • chenjie19891104
  • chenjie19891104
  • 2009年08月08日 10:18
  • 47878

oracle与sqlserver处理判断字段是否为空

最近项目中,当写查询语句的时候我们会遇到在查询时就要判断某个字段取出来是否为空,为空与不为空要返回成不同的值的问题,特意查询了oracle与sqlserver的不同写法。 oracle: NVL(E...
  • hah10
  • hah10
  • 2015年09月02日 10:13
  • 700

oracle 判断是否为空函数

nvl(t.aa,' ') as aa ,注:' '加空格
  • lixu_csdn
  • lixu_csdn
  • 2018年01月19日 11:30
  • 56

Oracle中的游标的原理和使用详解

逐行处理查询结果,以编程的方式访问数据 游标的类型: 1、隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql。 2、显式游标:显式游标用于处理返回多行的查...
  • paul50060049
  • paul50060049
  • 2016年06月20日 23:20
  • 4743

ORACLE 通过游标使用来了解cursor 的好处!

有了游标,就可以不用每条数据去检查是否符合条件,先看一下下面的: --游标使用(游标其实是一个放入内存临时表)declare   money cms3_simcard.card_fee%type :=...
  • shenghuiping2001
  • shenghuiping2001
  • 2009年12月30日 11:28
  • 1487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle中判断空游标的方法
举报原因:
原因补充:

(最多只允许输入30个字)