programing

커서가 오라클에서 레코드를 반환하는지 확인하는 방법은 무엇입니까?

newstyles 2023. 7. 23. 14:06

커서가 오라클에서 레코드를 반환하는지 확인하는 방법은 무엇입니까?

커서를 사용한 저장 프로시저는 다음과 같습니다.커서가 레코드를 반환하는지 여부에 따라 처리해야 합니다.

하지만 커서가 레코드를 반환하는지 어떻게 확인해야 할지 모르겠습니다.

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;

커서가 레코드를 열지 않고 반환하는지 확인할 수 없습니다.
(여기 참조)
따라서 레코드가 있는지 확인하기 위해 빠른 쿼리를 사용할 수 있습니다(예: 카운트 사용).

또는 다음과 같이 수행할 수 있습니다.

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;

제 생각에 그것은 단지 가능하다고 생각합니다.FETCH사용해 보십시오.

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

하지만 누군가 다른 방법을 알고 있다면 저를 고쳐주세요.

나는 이런 방식이 좋습니다.

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_

커서를 구성하는 동일한 선택 쿼리를 사용하고 변수로 반환되는 카운트를 선택합니다.그런 다음 변수를 평가하여 다음에 수행할 작업을 결정할 수 있습니다.예를 들어 다음과 같은 커서가 있습니다.

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

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;

언급URL : https://stackoverflow.com/questions/10814111/how-to-check-if-cursor-returns-any-records-in-oracle