커서가 오라클에서 레코드를 반환하는지 확인하는 방법은 무엇입니까?
커서를 사용한 저장 프로시저는 다음과 같습니다.커서가 레코드를 반환하는지 여부에 따라 처리해야 합니다.
하지만 커서가 레코드를 반환하는지 어떻게 확인해야 할지 모르겠습니다.
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
'programing' 카테고리의 다른 글
키 Json, Sum 및 동적 그룹화 방법 (0) | 2023.07.23 |
---|---|
계산 공식이 아닌 Excel 셀 값 읽기 -openpyxl (0) | 2023.07.23 |
"x < y < z"가 "x < y and y < z"보다 빠릅니까? (0) | 2023.07.23 |
vuex store의 replaceState 함수가 호출될 때 알 수 있는 방법이 있습니까? (0) | 2023.07.18 |
api를 사용하여 워드프레스에 게시하는 방법은 무엇입니까? (0) | 2023.07.18 |