2012-10-19 1 views
3

데이터베이스 쿼리 결과를 반환하는 Oracle 저장 프로 시저를 작성하고 있습니다. 쿼리가 결과를 생성하지 않으면 두 번째 쿼리를 해당 위치에서 실행해야합니다.Oracle DB : 첫 번째 쿼리가 비어 있으면 두 번째 쿼리를 반환하십시오.

INSERT INTO @TableVar 
SELECT <joinQuery1>; 

IF (SELECT COUNT(*) FROM @TableVar) > 0 
BEGIN 
    SELECT * FROM @TableVar; -- returns <joinQuery1> 
END 
ELSE 
    SELECT <joinQuery2>; --returns <joinQuery2> 
END 

그러나, 나는 오라클에서 같은 작업을 수행하는 방법 주위에 내 머리를 정리 할 수 ​​없습니다

는 SQL 서버에서, 나는 다음과 같은 사용하여이 일을 수행 할 수 있습니다. 당신이 활용할 수

+0

또는 오히려, 내가 DRY를 위반하지 않고 그것을 할 수있는 방법을 찾을 수 없습니다 같은 것을 고려하시기 바랍니다. (SELECT ) UNION ALL (SELECT WHERE SELECT COUNT () = 0)가 작동해야하지만 최후의 수단으로 만 사용합니다. –

답변

6

이 더 나은 (쉽게 유지하기 위해)을 수행 할 수 있습니다 :

WITH query1 as (
    select 1, 2 
    from dual 
    where 1=0 
    connect by level <= 10 
), 
query2 as (
    select 3, 4 
    from dual 
    connect by level <= 10 
) 
select * 
from query1 
union all 
select * 
from query2 
where not exists (
    select null 
    from query1 
); 

를이 쿼리 1에서 10 개 행을 반환해야합니다이므로. 당신이 where 1 = 0을 query1로부터 제거하면 (실제로 행을 리턴하게 함), query1로부터 10 개의 행을 얻어야한다.

+0

아름다운! 유지 관리 및 성능 (이 순서대로)은 "재 쿼리"를 수행 할 때의 두 가지 문제점 이었지만 매우 성공적이었습니다. 고맙습니다! –

0

답변은 쿼리 결과를 어떻게 더 활용할 것인지에 따라 크게 다릅니다. 따라서 파이프 라인 된 함수를 사용하거나 GTT에 삽입하거나 참조 커서를 반환해야합니다.

어쨌든 읽기 일관성을 위해 1 개의 SQL 문에서 수행하도록 권장합니다.

그래서

create procedure test (pCursor out sys_refcursor) is 
begin 
open pCursor for 
select <joinQuery1> 
union all 
SELECT <joinQuery2> 
where not exists (select 1 from joinquery1) 
; 
end; 
+0

그것은 초기 생각 이었지만 유지 관리 관점에서 보았을 때 을 2 곳에서 관리해야했습니다. 위에서 언급 한 'WITH' 절 Craig가이 문제를 매우 잘 처리합니다. –

관련 문제