CREATE OR REPLACE PROCEDURE test1
(
  cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
 v_database NVARCHAR2(128);
BEGIN--这个结果集我要得到
open cv_1 for
  SELECT *  
  FROM ( SELECT 字段1,字段2 FROM 表1 )
  WHERE ROWNUM <= 1;  IF ( 没有记录 ) THEN --请问这个如果处理  SELECT *
  INTO v_database from (select 字段1 from 表2)  IF ( 存在记录 ) THEN --请问这个如果处理
  --这个结果集我要得到
  open cv_2 for SELECT v_database from dual;
  else
  操行别的操作
  END IF;
  END IF;END;
-------------------------
CV_1 外面要得到的,不想再执行一次count(*),请问有没有好的解决方法

解决方案 »

  1.   

    用一个变量存起来啊。可参考:
      procedure usp_LoadPage(p_return_cursor out pkg_common.type_cursor, p_page_index number, p_page_size number) is
        v_sql varchar2(200);
        v_rec_count number;
        v_min number;
        v_max number;
      begin
        v_sql := 'select count(1) from TB_BASE';
        execute immediate v_sql into v_rec_count;    v_max := p_page_index * p_page_size;
        v_min := v_max - p_page_size + 1;
        v_sql := 'select * from (select rownum rn, A.* from TB_BASE A where rownum <= ' || v_max || '   ) where rn >= ' || v_min ;
        --v_sql := 'select * from (select rownum rn, A.* from TB_BASE A where rownum <= ' || v_max || '  order by fieldName) where rn >= ' || v_min ;
        open p_return_cursor for v_sql;
      end;
      

  2.   

    就这两种方法了
    那你就去提取游标 估计这个效率还不一定有执行count(*)高
    自己看着办吧
      

  3.   

    应该是count(*)效率高啊,都用存储过程了不在乎多写几句把
      

  4.   

    先进行COUT()判断,然后再进行游标操作
      

  5.   

    貌似这问题昨天就贴过.
    感觉楼主有滥用游标的嫌疑,能不用游标就不要用,效率比sql语句还是要差很多的.
      

  6.   


    你这个为什么一定要游标  count(*) 不行吗?
      

  7.   


    CREATE OR REPLACE PROCEDURE test1
    (
      cv_1 IN OUT SYS_REFCURSOR,
    cv_2 IN OUT SYS_REFCURSOR
    )
    AS
     v_database NVARCHAR2(128);
    BEGIN
    open cv_1 for
      SELECT * 
      FROM ( SELECT 字段1,字段2 FROM 表1 )
      WHERE ROWNUM <= 1;    Loop
              Fetch cv_1 Into cv_1_Row;
              EXIT WHEN cv_1%NOTFOUND;  --存在记录
      BEGIN
         blnRecode = true;  --true:have data  open cv_2 for SELECT v_database from dual;  -- 没有记录
      IF blnRecode = false THEN
        SELECT *
        INTO v_database from (select 字段1 from 表2)
      END IF;END;
      

  8.   

    如果存储过程中
    有多个
    select 
    外面用dataset来接收,不得用游标吗。还有别的方法。
      

  9.   

    就事论事
    对是否存在记录的判断如果用select count(*) into v_flag from tab;
    if v_flag > 0 thenend if;如果tab记录特别多的话 select count(*) from tab 很慢。可以考虑这样:
    select count(*) into v_flag from tab where rownum < 2;
      

  10.   

    用cursor%notfound来判断啊因为只取一条所以我觉得不用cursor, 用select into 用no_data_found来判断