2012-05-30 6 views
4

커서를 사용하는 다음 저장 프로 시저가 있습니다. 커서가 레코드를 리턴하는지 여부에 따라 일부 처리를 수행해야합니다.커서가 oracle에 레코드를 반환하는지 확인하는 방법은 무엇입니까?

그러나 커서가 레코드를 반환하는지 확인하는 방법을 모르겠습니다.

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; 

답변

10

커서가 레코드를 열지 않고 레코드를 반환하는지 확인할 수 없습니다.
당신이 이런 식으로 작업을 수행 할 수 있습니다, (예를 들어 수를 사용하여) 레코드가있는 경우 바로 볼 그래서 당신은 몇 가지 빠른 쿼리를 가질 수 있습니다


(here 참조) 또는 :

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; 
9

FETCH으로만 가능하다고 생각합니다. 사용하려고 시도

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

누군가가 다른 방법을 알고 있다면 나를 수정하십시오.

+1

예'하지 않고 FETCH', 그들은 쓸모가 있습니다. 커서 속성 설명 : http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#LNPLS541 – ipip

0

: 커서가 (빈되지 않음) 1 = 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 = 0 (비어 있음)입니다 :

NOTFOUND,RC=0_0_ 
관련 문제