2016-06-22 1 views
0

안녕하세요, 나는 조건에 따라 다른 열에 선택을 수행해야하는 문제가 있습니다. 나는 이것을 부정한 IF ELSIF 절로 저장 프로 시저에서 얻을 수 있지만 이것을 해결하는 가장 좋은 방법을 알고 싶습니다.오라클 PL/SQL - 조건에 따라 다른 열에서 select, group-by, order-by, where-clause를 수행하는 가장 좋은 방법은 무엇입니까?

PROCEDURE notSoSmartSelect(type IN VARCHAR, a_filter IN VARCHAR 
      , b_filter IN VARCHAR, results OUT SYS_REFCURSER) IS 
BEGIN 
    IF type = 'A' THEN 
    OPEN results FOR 
     SELECT a, sum(val) v FROM sample_table 
     GROUP BY a, ORDER BY a; 
    ELSIF type = 'B' THEN 
    OPEN results FOR 
     SELECT b, a, sum(val) v FROM sample_table 
     WHERE a = a_filter 
     GROUP BY b, a, ORDER BY a, b; 
    ELSIF type = 'C' THEN 
    OPEN results FOR 
     SELECT c, b, a, sum(val) v FROM sample_table 
     WHERE a = a_filter AND b = b_filter 
     GROUP BY c, b, a, ORDER BY a, b, c; 
    END IF; 
END; 

당신이 발견 한 것처럼, 각각의 경우에 사용되는 테이블은 동일하지만 서로 다른 가져 오는 데 사용되는 열, 필터, 그룹 및 순서가있다 예를 들면 : 그것을 명확하게합니다.

위의 코드는 매우 단순 해 보이지만 실제로는 많은 분기가 있고 여러 개의 if-else가있어 코드가 매우 더럽습니다. 이것을 접근하는 우아하고 깨끗한 방법이 있습니까? 어쩌면 동적 SQL? 그러나 나는 이것을 위해 동적 인 SQL을 작성하는 가장 좋은 방법을 찾아내는 것 같다. 미리 감사드립니다.

답변

1

나는 이것을 "부정하다"고 생각하지 않습니다. 쿼리는 서로 매우 다르므로 단일 문으로 병합하려고하지는 않습니다.

그러나 서로 다른 열 (선택된 다른 열, 다른 집계 그룹, 다른 where 절)이 주어지면 왜 모두 하나의 절차에 있습니까? 나는이 세 가지 절차가 있다면 그것을 만들 것이다. 아마 오히려 3 개의 전망.

0

이것은 동적 SQL 접근 방식보다 훨씬 명확합니다. 언급했듯이 많은 IF ELSE 지점을 가지고 있기 때문에 많은 것을 구성하는 것이 매우 번거롭고 많은 조건이있는 "TEST"입니다.

내 생각에 refcursorJAVA과 같은 프런트 엔드 응용 프로그램에서 사용되므로 전체 출력물을 반품 한 다음 그 모든 조작을 수행하는 것이 좋습니다.

+0

나는 그런 식으로하고 싶지만 불행히도 약 50 만 건의 레코드가 있습니다 ... 데이터베이스에서 한 번에 많은 레코드를 가져 오는 데 너무 오래 걸리는 반면 where 절을 사용하는 쿼리는 약 60 레코드 만 반환합니다 . – Ocelot

+0

그런데 불행히도 이것이 내가 생각할 수있는 유일한 접근법입니다. –