情况是这样的,已知一条sql语句,select * from tb编程,执行这条sql语句,一条一条fetch取返回值前,我想知道这条sql语句会返回多少条记录集,我好再做其它操作。所以我需要一个功能,就是要知道这条sql语句的返回记录数。有一些数据库,如mysql,会提供get_row_num api,能够取得记录集数。
但我所知oracle没有提供这样的api,sqlserver也没有。在sqlserver中,我想到了一个办法,就是建立一个存储过程,用游标方式执行这条sql语句,并通过sqlserver提供的功能返回记录集个数。CREATE PROCEDURE GetRowNum
@sqlstr nvarchar(4000)
as
set nocount on
declare @P1 int,
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select @rowcount as sqlrowcount
exec sp_cursorfetch @P1
exec sp_cursorclose @P1
set nocount off这样,执行这个存储过程,就能同时返回记录集个数,和记录集。但在oracle中,我找不到相应的东西。请达人指教在oracle如何取得一条sql语句的记录个数,不要告诉我用select count(*) from (subsql),这样的话,我认为效率是很低的。

解决方案 »

  1.   

    查询的话好像真没有什么好办法 但是update或者delete的时候,结果集可以用sql%rowcount来取得
      

  2.   

    错了但是update或者delete的时候,更新或者删除的结果集个数可以用sql%rowcount来取得 
      

  3.   

    select count(*) over() as allcount, tb.*  from  tb 
    allcount就是条数
    数据量大的时候慎用
      

  4.   

    这样跟用select count(*) from (select * from tb)+select * from tb两条sql执行一次,一样的效率吧。有没有更高效率的方法?
      

  5.   


    不一样把
    select count(1) from tb
    怎么会和 select * from tb
    一样 不解??????
      

  6.   

    fetch前,想知道这条sql语句会返回多少条记录
    也不知道有什么好的办法,
    不过fetch的时候 可以 cursorname%rowcount 来统计fetch的次数帮鼎
      

  7.   

    select count(*) over(), tb.*  from  tb  
      

  8.   

    樓上的請教下
    select count(*) over() from  tb
    over() 加在 檢索對象後面有什麽用途,爲什麽要加,能詳細介紹下over() 麽?謝謝
      

  9.   

    直接select count(*) into cnt from tb;不就可以了吗?
      

  10.   

    看了半天没看懂,原来是sql server中的
      

  11.   

    不是啊,我问的是oracle问题,贴子中的例子只是我举的sqlserver实现方法,但oracle找不到对应的好方法
      

  12.   


    同学...看来你还没有搞清楚ORACLE COUNT(*)与COUNT(1)的关系.
    COUNT(1)是统计该表第一列的所有行.
    COUNT(*)是统计该表的所有列的所有行.
      

  13.   

    在oracle的plsql块中
    select 只能与into连用而且只能返回一条记录
    如果不是在plsql块中所有的sql语句oracle都认为是隐式cursor
    想得到sql语句所影响的行数就可以通过sql%rowcount属性得到