2012-05-18 4 views
1

에 따라 우리는 현재 다음 작업을 수행 할 필요가있는 저장된 프로 시저가 있습니다 Query1을 어떤 결과가 대한 SYS_REFCURSOR 커서를 열고 QUERY2Oracle 저장 프로 시저 횟수

에 대한 커서를 열 다시 다른 을 반환 반환하는 경우 을

현재 Query1의 from 및 where 절에서 count (*)를 수행하고 if-else stmt에서 count를 사용합니다. 그러나 이렇게하면 query1이 두 번 실행됩니다. 이 방법을 최적화 할 수 있습니까?

답변

1

query1에 대한 커서를 열어 & 실제 쿼리를 수행하십시오. BEGIN .. END 블록으로 마무리하십시오. & 데이터를 찾을 수 없음 예외를 잡으십시오.

BEGIN 

-- query1 code 

-- return data 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    NULL; 

BEGIN 
-- query2 code 

-- return data 

END; 

query1에 의해 반환 된 데이터가 없을 때 query2 코드가 실행됩니다. ROWNUM은 오라클이 중지하도록 할 수 있습니다

select count(1) 
into v_cnt 
from some_table 
where some_field like 'ABC%' 
and rownum <= 1; 

:

0

은 나뿐만 아니라 필의 답변을 좋아하지만, 또 다른 옵션처럼 ROWNUM의 stopkey를 사용하여 사용중인 같은 논리를 사용하지만, 카운트 쿼리를 변경하는 것입니다 일단 히트를 얻으면 (즉, 쿼리에서 반환되는 하나 이상의 행이 있음을 의미) 계산합니다. 물론 데이터와 쿼리에 따라 큰 차이를 만들 수 있습니다.

관련 문제