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로 하면 테이블명도 변수로 넣을 수 있다던데
예문을 봐도 잘 모르겠네요.....
답변 감사합니다 우리집아찌님
VIEW나 파티션테이블로 테이블을 모두 합쳐서 그쪽에서 간단하게 조회하는 방법도 있다고 찾아봤으나
오라클 함수로 12개의 테이블을 선택적으로 조회하는 쿼리구현방법이있나 여쭤봤습니다.ㅠㅠ
제가 올린 쿼리를 dynamin sql로 만들어서 2개의테이블을 테이블명+동적파라미터로 테이블명을 조회하는거까진 성공했는데요
만약 달력날짜를 2020-05-01 ~ 2020-08-10 선택할 시 4개의테이블을 조회해야하니
이게 또 문제가되네요...... 혹시 본문쿼리 실행하기 전 PRAGMA AUTONOMOUS_TRANSACTION 을 사용하여
시작달 끝달 보낸 파라미터값 사이의 값을 구하여 변수에 담고
그 변수를 본문쿼리에서 테이블명 뒤에 붙여서 조회하는방법도 잇을까요 짧은지식으로 도저히 모르겠어서 여쭤보겠습니다
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'
파이프라인 함수를 검색해봤는데 잘 이해가 안되네요..... 오라클초보자라.... 제가하고싶은건
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)와 같이 사용할수는 없는지요.....