오라클 함수 날짜선택 시 테이블명 변수로 받아서 사용하고 싶은데요(수정) 0 6 5,744

by 정XX [SQL Query] 프로시저 함수 QUERY ORACLE [2020.08.10 11:27:05]


월별로 12개의 테이블이 있습니다.

LOG01 ~ LOG12 까지요...

LOG 뒤에 달력선택 시 선택한 월을 뒤에 잘라서 붙여넣고 싶은데

쿼리를 어떻게 작성해야 할지 모르겠습니다.

만약 선택한 시작날과 끝날이 겹치지않는 7월 ~ 8월 일 시 

두개의 테이블을 UNION해서 조회를해야하기에 테이블명을 변수로 사용하고 싶습니다.

create or replace FUNCTION QUERY_LOG (
        startDate   IN VARCHAR2,
        endDate     IN VARCHAR2,
        startMMdate IN VARCHAR2,
        endMMdate   IN VARCHAR2,
)

RETURN SYS_REFCURSOR
PARALLEL_ENABLE

IS

    c_statistics SYS_REFCURSOR;

BEGIN

    OPEN c_statistics FOR
    
    SELECT *  FROM
        (SELECT * FROM LOG07(07대신 전달받은 파라미터 월명 startMMdate)
         WHERE REG_DATE >= TO_DATE(startDate)
         UNION
         SELECT * FROM LOG08(08대신 전달받은 파라미터 월명 endMMdate)
         WHERE REG_DATE <= TO_DATE(endDate)+1) T
    ORDER BY REG_DATE DESC;
    
    RETURN c_statistics;
    
END QUERY_LOG;

 

테이블명을 직접 넣었을땐 조회가 되는데요

테이블명의 LOG 뒤에 선택한 월을 파라미터값으로 가져와 붙이면 될거같은데

동적쿼리 검색해보니 execute immediate로 하면 테이블명도 변수로 넣을 수 있다던데

예문을 봐도 잘 모르겠네요.....

by 우리집아찌 [2020.08.10 18:07:07]

다른방법으로는 VIEW 를 만드시는 방법도 있습니다.

CREATE VIEW ...

(

.
.

SELECT * FROM LOG06

UNION ALL

SELECT * FROM LOG07

UNION ALL

SELECT * FROM LOG08
.

)

by 정XX [2020.08.12 14:54:06]

답변 감사합니다 우리집아찌님

VIEW나 파티션테이블로 테이블을 모두 합쳐서 그쪽에서 간단하게 조회하는 방법도 있다고 찾아봤으나

 

오라클 함수로 12개의 테이블을 선택적으로 조회하는 쿼리구현방법이있나 여쭤봤습니다.ㅠㅠ

제가 올린 쿼리를 dynamin sql로 만들어서 2개의테이블을 테이블명+동적파라미터로 테이블명을 조회하는거까진 성공했는데요

만약 달력날짜를 2020-05-01 ~ 2020-08-10 선택할 시 4개의테이블을 조회해야하니

이게 또 문제가되네요...... 혹시 본문쿼리 실행하기 전 PRAGMA AUTONOMOUS_TRANSACTION 을 사용하여

시작달 끝달 보낸 파라미터값 사이의 값을 구하여 변수에 담고

그 변수를 본문쿼리에서 테이블명 뒤에 붙여서 조회하는방법도 잇을까요 짧은지식으로 도저히 모르겠어서 여쭤보겠습니다


by 우리집아찌 [2020.08.12 15:06:38]
 VIEW를 사용한다면 이런식으로 사용가능하겠죠


CREATE VIEW LOG2020
 
(
.
.
SELECT  '202006' MM  ,A * FROM LOG06 A
 UNION ALL
SELECT  '202007' MM  ,A * FROM LOG07 A
 UNION ALL
SELECT  '202008' MM  ,A * FROM LOG08 A
 UNION ALL
SELECT  '202009' MM  ,A * FROM LOG09 A
.
 
)


SELECT * 
  FROM LOG2020
 WHERE MM BETWEEN '202005' AND '202008'
      AND DT BETWEEN '2020-05-01' AND '2020-08-10' 

 


by 정XX [2020.08.12 15:13:23]

뷰를 사용하면 쉽게 되겠지만..

함수로만 구현가능한 방법은 없나보네요.....

답변 감사합니다


by 우리집아찌 [2020.08.12 15:24:02]

함수로 처리하신다면 PIPE LINE 함수가 있습니다.

http://www.gurubee.net/lecture/2238


by 정XX [2020.08.12 16:41:28]

파이프라인 함수를 검색해봤는데 잘 이해가 안되네요..... 오라클초보자라.... 제가하고싶은건

5월에서 8월을 선택하였을 시 5 6 7 8 월을 조회해야하기 때문에

본문 SELECT문 적용하기전에 

PRAGMA 트랜잭션 사용해서 

선택한 시작달 끝달을 DUAL 가상테이블로 SELECT하여 커서변수에 담고 

endMMdate = 08

startMMdate = 05

CURSOR mmDate IS

 select LEVEL lvl from
  ( select rownum n from dual connect by level <= endMMdate)
 where n >= startMMdate; 와 같이 05 06 07 08 을 조회하여

 

그 밑에 본문 SELECT문 시 

FOR 커서변수명 IN mmDate(위에 PRAGMA SELECT 커서변수)

SELECT * FROM LOG(월명)대신 전달받은 파라미터 LOG+(mmDate)와 같이 사용할수는 없는지요.....

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입