Вопрос по – Как проверить, возвращает ли курсор какие-либо записи в oracle?

6

У меня есть следующая хранимая процедура, в которой я использовал курсор. В зависимости от того, возвращает ли курсор какие-либо записи или нет, мне нужно выполнить некоторую обработку.

Но я не уверен, как проверить, возвращает ли курсор какие-либо записи.

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;

Ваш Ответ

3   ответа
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_
11

FETCH, Попробуй использовать

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

Но если кто-то знает другой способ, поправьте меня.

Error: User Rate Limit ExceededFETCHError: User Rate Limit Exceededdocs.oracle.com/cd/E11882_01/appdev.112/e25519/…
12


(увидетьВот)
Таким образом, вы можете получить быстрый запрос, чтобы посмотреть, есть ли записи (например, с помощью 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;

Похожие вопросы