首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ORACLE SQL%ROWCOUNT在游标读取中不起作用

在Oracle数据库中,%ROWCOUNT是一个特殊的PL/SQL变量,用于获取最近一次执行的SQL语句所影响的行数。它通常用于判断SQL语句的执行结果,比如判断是否有数据被更新或删除。

然而,在游标读取中,%ROWCOUNT并不起作用。这是因为在游标读取过程中,Oracle数据库并不会立即知道要返回的结果集的总行数。相反,它会根据需要逐行获取数据,直到结果集被完全读取。

因此,在游标读取中,使用%ROWCOUNT无法准确地获取结果集的行数。如果需要知道结果集的行数,可以使用其他方法,比如使用COUNT函数来统计结果集的行数。

对于游标读取中的%ROWCOUNT无效的情况,可以考虑以下解决方案:

  1. 使用COUNT函数:在游标读取之前,可以先执行一个COUNT查询来获取结果集的行数。例如:

SELECT COUNT(*) INTO row_count FROM table_name WHERE condition;

这样可以得到结果集的行数,并将其存储在一个变量中供后续使用。

  1. 使用游标属性:在PL/SQL中,游标有一些属性可以提供有关结果集的信息。其中包括%FOUND、%NOTFOUND、%ISOPEN等。可以根据这些属性来判断游标是否已经读取完毕,从而间接地获取结果集的行数。

例如,可以使用以下代码来获取结果集的行数:

DECLARE

代码语言:txt
复制
 cursor_name CURSOR IS SELECT * FROM table_name WHERE condition;
代码语言:txt
复制
 row_count NUMBER := 0;

BEGIN

代码语言:txt
复制
 OPEN cursor_name;
代码语言:txt
复制
 LOOP
代码语言:txt
复制
   FETCH cursor_name INTO ...;
代码语言:txt
复制
   EXIT WHEN cursor_name%NOTFOUND;
代码语言:txt
复制
   row_count := row_count + 1;
代码语言:txt
复制
 END LOOP;
代码语言:txt
复制
 CLOSE cursor_name;
代码语言:txt
复制
 DBMS_OUTPUT.PUT_LINE('Total rows: ' || row_count);

END;

需要注意的是,以上解决方案仅适用于游标读取的情况。对于其他类型的SQL语句,%ROWCOUNT仍然可以正常使用。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【DB笔试面试576】Oracle,简述Oracle游标

♣ 题目部分 Oracle,简述Oracle游标。 ♣ 答案部分 介绍游标之前先介绍一下Oracle数据库库缓存(Library Cache)的作用及其组成结构。...当同样的SQL语句和PL/SQL语句再次被执行的时候就可以直接利用已经缓存在库缓存的那些相关对象而无须再次从头开始解析,这样就提高了这些SQL语句和PL/SQL语句重复执行时的执行效率。...库缓存(Library Cache)SGA的位置如下图所示: ?...当Oracle要执行目标SQL“select * from lhr.emp”时,首先会对该SQLSQL文本进行哈希运算,然后根据得到的哈希值找到相关的Hash Bucket,Hash Bucket遍历对应的库缓存对象句柄链表...② 对每一个库缓存对象而言,都或多或少需要往库缓存存储一些该库缓存对象所特有的动态运行时(runtime)数据,比如SQL语句所对应的库缓存对象就需要在库缓存缓存该SQL语句所对应的编译好的二进制格式的执行计划

1.3K20

【DB笔试面试577】Oracle游标有哪几类?

♣ 题目部分 Oracle游标有哪几类?...Oracle解析目标SQL时去库缓存查找匹配Shared Cursor的过程如下图所示: ?...从上图可以看出,Oracle解析目标SQL时去库缓存查找匹配共享游标(Shared Cursor)的过程包含如下几个步骤: (1)根据目标SQLSQL文本的哈希值去库缓存查找匹配的Hash Bucket...(3)步骤(2),如果找到了匹配的父游标,那么Oracle接下来就会遍历从属于该父游标的所有子游标以查找匹配的子游标。...匹配的父游标查找匹配的子游标时,如果找到了匹配的子游标,那么Oracle就会把存储于该子游标的解析树和执行计划直接拿过来重用,而不用再从头开始解析。

79810
  • 【DB笔试面试578】Oracle,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?

    ♣ 题目部分 Oracle,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?...由于缓存会话游标的哈希表的对应Hash BucketOracle会存储目标SQL对应的父游标的库缓存对象句柄地址,所以,Oracle可以通过会话游标找到对应的父游标,进而就可以找到对应子游标目标...隐式游标、显式游标SQL%ROWCOUNT数值型表示最近的一条SQL语句成功执行后受其影响而改变的记录的数量,后续执行的SQL会覆盖SQL%ROWCOUNT的值。...Oracle 10g默认为20(注意:官方文档记录的该值默认为0是有误的),11g默认为50。...① Oracle 11gR2,一个会话游标能够被缓存在PGA的必要条件是该会话游标所对应的SQL解析和执行的次数要超过3次。

    1.4K30

    【DB笔试面试585】Oracle,什么是常规游标共享?

    ♣ 题目部分 Oracle,什么是常规游标共享?...下面分别来介绍常规游标共享和自适应游标共享这两个方面。 1、 常规游标共享 常规游标共享是Oracle 8i引入的。...当开启了常规游标共享后,Oracle实际解析目标SQL之前,会先用系统产生的绑定变量来替换目标SQLSQL文本WHERE条件或者INSERT的VALUES子句中的具体输入值,这样替换后实际执行的...Oracle 10g及其后续的版本Oracle会自动收集直方图统计信息,这意味着Oracle 10g及其后续的版本中出现不安全的谓词条件的概率要大大高于Oracle 10g之前的版本,所以Oracle...Oracle 11g里也不要将CURSOR_SHARING的值设成SIMILAR,因为Oracle 11g里自适应游标共享已经被默认启用了,自适应游标共享被启用的情形下,Oracle并不推荐将CURSOR_SHARING

    88840

    游标--数据库

    1,大家都知道数据库的事物可以回滚,而游标在其中起着非常重要的作用,由于对数据库的操作我们会暂时放在游标,只要不提交,我们就可以根据游标内容进行回滚,一定意义有利于数据库的安全。                 ...2,另外,OraclePL/SQL只能返回单行数据,而游标弥补了这个不足。相当于ADO.NET的Data table吧。...例如SQL%rowcount..../SQL语句即可完成的,这样我们在这里就必须用到循环结构了,Oracle数据库我们可以使用while…… loop……end loop , for…… loop……end loop,loop……end...在这里需要提出的是,for循环结构Oracle中被简化了,我们只需要声明和使用即可。

    81630

    PLSQL -->隐式游标(SQL%FOUND)

    --=============================== -- PL/SQL -->隐式游标(SQL%FOUND) --=============================== PL.../SQL游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括 声明游标,打开游标,从游标提取数据,关闭游标。...其过程由oracle控制,完全自动化。隐式游标 的名称是SQL,不能对SQL游标显式地执行OPEN,FETCH,CLOSE语句。...当执行select into ,insert update,delete时,Oracle会隐含地打开游标,且该语句执行完毕或隐含地关闭 游标,因为是隐式游标,故SQL%ISOPEN总是false...SQL%ROWCOUNT 执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为,如果没有 成功,SQL%

    1.3K30

    PLSQL-游标

    REF游标和静态游标的区别 1)静态游标不能返回到客户端。ref游标能够被返回到客户端,是从Oracle的存储过程返回结果集的方式。 2)不能在包说明或包体的过程或函数之外定义ref游标。...PL/SQL中使用DML语言,使用ORACLE提供的名为“SQL”的隐示游标。...%FOUND:变量最后从游标获取记录的时候,结果集中找到了记录。...%NOTFOUND:变量最后从游标获取记录的时候,结果集中没有找到记录。 %ROWCOUNT:当前时刻已经从游标获取的记录数量。 %ISOPEN:是否打开。...多表查询,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。

    73920

    Oracle游标Cursor使用实例

    Oracle数据库里,任意一个目标sql一定会同时对应两个shared cursor。...解析和执行目标sql时,始终会先去当前session的pga寻找是否有匹配的缓存session cursor 2 在当前session的pga找不到匹配的缓存,Oracle就去缓存寻找是否存在匹配的...0,执行前为null,没有返回或没有改变任何记录,其值为TRUE,否则为FALSE SQL%ISOPEN:表示隐式游标是否处于open状态,对于隐式游标,其值永远是FALSE SQL%ROWCOUNT:...表示一条sql语句成功执行后受其影响而改变的记录的数量,代表最近一次执行的sqlsql%rowcount,没有任何记录的值0 2 显式游标 plsql,显式的打开,关闭 Cursorname%found...里的共享游标 Shared cursor之间的共享,就是重用存储child cursor的解析树和执行计划,避免不用从头开始硬解析 常用游标共享,参数cursor_sharing select *

    1K10

    Oracle数据库学习笔记(七 —— 游标

    如果要对列的指定行进行操作,就必须使用游标。...当在PL/SQL执行查询语句(SELECT)和数据操纵语句(DML)时,Oracle会为其分配一个上下文区(Context Area) 游标是指向上下文区的指针,它为应用提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法...注意: 显示游标 PL/SQL 块的声明部分定义查询,该查询可以返回多行 显示游标的操作过程 数据库 ——> (打开游标)——> 得到数据库的内容 ——> 提取行(得到变量)——> 关闭游标 示例...(游标 for 循环) 游标for循环简化游标处理 使用游标for循环时,oracle隐含打开游标,提取数据并关闭游标。...Oracle隐式地打开、提取,并总是自动地关闭SQL游标 隐式游标属性包括 SQL%FOUND、 SQL%NOTFOUND SQL%ROWCOUNT SQL%ISOPEN declare v_empno

    99010

    【DB笔试面试586】Oracle,什么是自适应游标共享(4)?

    ]之内,所以刚才Oracle执行上述SQL时(即第8次执行目标SQL)用的就是软解析/软软解析,并且此时重用的就是CHILD_NUMBER为5的Child Cursor存储的解析树和执行计划。...l 为了存储这些额外的Child Cursor,Shared Pool空间方面也会承受额外的压力(所以当从Oracle 10g升级到Oracle 11g时,Oracle会建议适当增加Shared Pool...这里需要注意的是,自适应游标共享Oracle 11g中有一个硬限制——只有当目标SQL的绑定变量(不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的)的个数不超过14个时,自适应游标共享才会生效...,可以推断出如果自适应游标共享对上述SQL不起作用的话,那么常规游标共享就会起作用,即上述SQL在被执行了三次的情况下应该只会产生一个Child Cursor。...数据库与自适应游标共享相关的全部内容。

    56620

    PLSQL编程—游标

    一、游标的相关概念:   定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标的数据...a)静态游标    -  隐式游标    -  显式游标    b)Ref游标   三、游标具有的属性 %notfound 询问是否没有结果集 %found    询问是否存在结果集 %rowcount...返回受影响的行数 %isopen   询问游标是否已经打开  四、隐式游标 隐式游标 ---由Oracle数据库自动创建,名称是(SQL) ,主要用途是可以返回一个操作是否成功或失败.   ...SQL%notfound  --返回Boolean值  存在结果集返回 False    SQL%found    --返回Boolean值   存在结果集返回 True    SQL%rowcount...  --用户成功提取数据的行数    SQL%isopen   --隐式游标里一般这个属性是自动打开和关闭的.且任何时候查询都返回False 示例:向表插入一行数据,询问是否插入成功. declare

    33130

    【DB笔试面试586】Oracle,什么是自适应游标共享(1)?

    ♣ 题目部分 Oracle,什么是自适应游标共享?...Oracle 10g及其后续的版本Oracle会自动收集直方图统计信息,这意味着与之前的版本相比,Oracle 10g及其后续的版本Oracle有更大的概率会知道目标列实际数据的分布情况,也就是说绑定变量窥探的副作用将会更加明显...为了解决上述绑定变量窥探所带来的问题,Oraclel1g引入了自适应游标共享(Adaptive Cursor Sharing,ACS)。...先介绍Oracle数据库与自适应游标共享相关的一些基本概念。...这里需要注意的是,自适应游标共享Oracle 11g中有一个硬限制——只有当目标SQL的绑定变量(不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的)的个数不超过14个时,自适应游标共享才会生效

    67920

    【DB笔试面试586】Oracle,什么是自适应游标共享(2)?

    ,则Oracle此时除了会新生成一个Child Cursor之外,还会把存储相同执行计划的原有Child Cursor标记为非共享(把原有Child CursorV$SQL对应记录的列IS SHAREABLE...注意到“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'INDEX'”,这说明Oracle硬解析目标SQL的过程确实再次使用了绑定变量窥探...介绍自适应游标共享的整体执行流程时曾经提到过:对于标记为Bind Aware的Child Cursor所对应的目标SQL,当该SQL再次被执行时,Oracle就会根据当前传入的绑定变量值所对应的谓词条件的可选择率...注意到“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'SYNONYM'”,这说明Oracle硬解析该SQL的过程确实再次使用了绑定变量窥探...注意,“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'JAVA CLASS'”,说明Oracle硬解析上述SQL的过程确实再次使用了绑定变量窺探

    51830

    【DB笔试面试586】Oracle,什么是自适应游标共享(3)?

    对应的列VERSION_COUNT的值从之前的5变为了现在的6,列EXECUTIONS的值为7,说明Oracle第7次执行目标SQL时依然用的是硬解析。...注意,“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'CLUSTER'”,说明Oracle硬解析上述SQL的过程确实再次使用了绑定变量窺探...记录的之内,所以Oracle此时还是得用硬解析。...究其根本原因,还是因为自适应共享游标被启用的前提条件下,当已经被标记为Bind Aware的Child Cursor所对应的目标SQL再次被执行时,Oracle会根据当前传入的绑定变量值所对应的谓词条件的可选择率...如果当前传入的绑定变量值所在的谓词条件的可选择率处于该SQL之前硬解析时同名谓词条件V$SQL_CS_STATISTICS记录的可选择率范围之内,则此时Oracle就会使用软解析/软软解析,反之则是硬解析

    35330

    PLSQ编程

    对这种异常情况的处理,无需程序定义,由ORACLE自动将其引发。 非预定义 ( Predefined )错误 即其他标准的ORACLE错误。...-1---ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP) 游标 PL/SQL 程序,对于处理多行记录的事务经常使用游标来实现 为了处理 SQL 语句,ORACLE 必须分配一片叫上下文...TRUE; %ROWCOUNT 数字型属性,返回已从游标读取的记录数。...程序可以通过引用该索引记录变量元素来读取所提取的游标数据,index_variable各元素的名称与游标查询语句选择列表中所制定的列名相同。...,当最近一次读记录时成功返回,则值为true; SQL%NOTFOUND 布尔型属性,与%found相反; SQL %ROWCOUNT 数字型属性, 返回已从游标读取得记录数; SQL %ISOPEN

    1.5K10

    游标和动态SQL

    显示游标是有用户声明和操作的一种游标。隐式游标Oracle为所有的数据操作语句自动声明的一种游标。...每个用户的会话,我们可以同时打开多个游标,这个数量有数据库初始化参数文件的OPEN CURSORS这个参数来定义。...声明游标和变量都在declare的。通常先声明变量,声明游标。 2、打开游标,从打开游标开始,后面的步骤都是begin和end执行的。...语法:open;当打开游标后查询语句就开始执行了,查询结果放到Oracle的缓冲区,然后游标指向了这个缓冲区查询结果的第一行记录之前。...隐式游标与显示游标的相同的:有相同的属性,隐式游标使用属性的方法是属性名前面加上SQL%,即SQL%FOUND,SQL%ISOPEN等。

    1K10

    【DB笔试面试587】Oracle,常规游标共享和自适应游标共享的联系和区别有哪些?

    ♣ 题目部分 Oracle,常规游标共享和自适应游标共享的联系和区别有哪些? ♣ 答案部分 从严格意义上来说,常规游标共享和自适应游标共享是各自独立的,两者之间没有必然的联系。...常规游标共享的目的是通过使用系统产生的绑定变量替换目标SQLSQL文本的具体输入值,以达到不改一行应用代码的情况下,使那些仅仅是SQL文本的WHERE条件或者VALUES子句(适用于INSERT语句...)的具体输入值不同的目标SQL彼此之间共享解析树和执行计划。...Oracle 11g,对于使用了绑定变量的目标SQL而言,不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的,只要满足一定的条件(比如绑定变量窥探被开启,该SQL中使用的绑定变量的数量不超过...自适应游标共享被开启的情况下,Oracle并不推荐将CURSOR_SHARING的值设为SIMILAR,因为当把CURSOR_SHARING的值设为SIMILAR后,对自适应游标共享可能有不好的影响,

    58810

    SQL命令 DECLARE

    游标名称 游标名称区分大小写。 游标名称例程和相应类必须是唯一的。游标名称可以是任意长度,但在前29个字符内必须是唯一的。游标名称区分大小写。...SQL,如果对受影响的表和列具有适当的权限,则游标始终可以用于更新或删除操作。 DECLARE语句可以查询后指定FOR UPDATE或FOR READ ONLY关键字子句。...它们是作为代码记录发出查询的进程是否具有所需的更新和删除对象权限的一种方式提供的。 示例 下面的嵌入式SQL示例使用DECLARE为指定两个输出主机变量的查询定义游标。...,"读取的行数 = ",%ROWCOUNT &sql( CLOSE EmpCursor ) if SQLCODE < 0 { w "SQL关闭游标错误...,"读取的行数 = ",%ROWCOUNT &sql( CLOSE EmpCursor2 ) if SQLCODE < 0 { w "SQL关闭游标错误

    2.7K21
    领券