如何检查游标是否返回oracle中的任何记录?

时间:2012-05-30 10:03:56

标签: oracle cursor

我有一个以下存储过程,其中我使用了游标。根据游标是否返回任何记录,我需要进行一些处理。

但我不知道如何检查游标是否返回任何记录。

CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_LOOKUP_BY_EMP_ID
(
      IN_USER_ID IN NUMBER, 
      IN_EMPLOYEE_ID NUMBER,
      IN_HC_AS_ON_DATE VARCHAR2,
      emp_cursor OUT SYS_REFCURSOR
) 
IS 

 CURSOR employees IS 
    SELECT  * FROM EMPLOYEE e; 

BEGIN    

if(record exist ) then 

 FOR employee IN employees
  LOOP  

        // do something  

  END LOOP; 
else if employees is empty then 
     // do something else 

END;

5 个答案:

答案 0 :(得分:13)

无法打开光标,无法检查光标是否返回记录 (见here
所以你可以有一些快速查询只是为了查看是否有记录(例如使用count),

或者,您可以这样做:

CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_LOOKUP_BY_EMP_ID
(
      IN_USER_ID IN NUMBER, 
      IN_EMPLOYEE_ID NUMBER,
      IN_HC_AS_ON_DATE VARCHAR2,
      emp_cursor OUT SYS_REFCURSOR
) 
IS 

 is_found_rec boolean := false;    

 CURSOR employees IS 
    SELECT  * FROM EMPLOYEE e; 

BEGIN    

 FOR employee IN employees
  LOOP  

    is_found_rec := true;

        // do something  

  END LOOP; 

 if not is_found_rec then 
     // do something else 
 end if;

END;

答案 1 :(得分:11)

我认为只有FETCH才有可能。尝试使用

if myCursor%found then
// some body
end if;

但是,如果有人知道另一种方式,那么纠正我。

答案 2 :(得分:1)

我喜欢这样:

DECLARE

    CURSOR my_cur
    IS
    SELECT 'a' AS a FROM DUAL WHERE 1=1;

    my_rec my_cur%rowtype;

BEGIN
    OPEN my_cur;
    LOOP

        FETCH my_cur INTO my_rec;

        IF my_cur%NOTFOUND
        THEN
            IF my_cur%ROWCOUNT=0
            THEN
                -- do stuff when cursor empty
                DBMS_OUTPUT.PUT_LINE('NOTFOUND,RC=0' || '_' || my_cur%ROWCOUNT || '_' || my_rec.a);
            END IF;
            EXIT;
        ELSE
                -- do stuff when cursor not empty
            DBMS_OUTPUT.PUT_LINE('FOUND,RC>0' || '_' || my_cur%ROWCOUNT || '_' || my_rec.a);
        END IF;

    END LOOP;
    CLOSE MY_CUR;
END;

当光标为1 = 1(非空)时输出:

FOUND,RC>0_1_a

当光标为1 = 0(空)时输出:

NOTFOUND,RC=0_0_

答案 3 :(得分:0)

我喜欢使用包含游标的相同选择查询,然后选择返回到变量中的计数。然后,您可以评估该变量以确定下一步要做什么。例如,您有一个这样的光标:

CURSOR c_example IS 
    SELECT field1
        ,field2
        ,field3
    FROM table1 a
    WHERE a.field1 LIKE '%something%';

在打开游标进行任何处理之前,请将游标结果计数选择为变量。

SELECT count(*)
INTO v_exampleCount
FROM table1 a
WHERE a.field1 LIKE '%something%';

现在,再次打开游标之前,请执行以下操作:

IF exampleCount>0 THEN

    FOR example IN c_example
    LOOP
        ....
    END LOOP;  --end example loop

    ....

END IF;  --end example if

答案 4 :(得分:0)

341/5000 一种解决方案是使用反向逻辑。例如不可能问:

IF my_record IS NULL THEN
   do something;
END IF;

IF my_record.my_attibute IS NULL THEN
   do something;
END IF;

相反,可以问:

IF my_record.my_attibute IS NOT NULL THEN
   go on processing;
ELSE
   do something;
END IF;