by 정XX [SQL Query] 프로시저 함수 QUERY ORACLE [2020.08.12 18:03:13]
선택한 날짜 시작과 끝의 달력에 따른 테이블명을 조회하고싶은데요. 테이블명이 LOG01 LOG02 LOG03 ~ LOG12 이런식으로 12개의 달로 나뉘어있고 함수를 짰을 때 create or replace FUNCTION QUERY_LOG ( startDate IN VARCHAR2, endDate IN VARCHAR2, startMMdate IN VARCHAR2, //시작날짜 월자른 파라미터 endMMdate IN VARCHAR2, //끝날짜 월 자른 파라미터 ) RETURN SYS_REFCURSOR PARALLEL_ENABLE IS PRAGMA autonomous_transaction; CURSOR mmDate IS select LEVEL lvl from (select rownum n from dual connect by level <= endMMdate) where n >= startMMdate; c_log SYS_REFCURSOR; s_query varchar2(4000); BEGIN FOR cursorV IN mmDate IF startMMdate <> endMMdate THEN s_query := 'SELECT ROW_NUMBER() OVER (ORDER BY A4 DESC) T.A1, T.A2, T.A3, T.A4 FROM (SELECT A1, A2, A3, A4 FROM LOG'||mmDate||' WHERE A1 LIKE ''%A%'' ) T WHERE REG_DATE BETWEEN TO_DATE('''||startDate||''', ''YYYY- MM-DD'') AND (TO_DATE('''||endDate||''', ''YYYY-MM-DD'') + 1'; END IF; END LOOP;
이런형식으로 PRAGMA 사용하여 SELECT 문으로 조회한 값을 커서변수에 담고 본문SELECT에 담긴 커서변수의 선택한 월과 중간사이월을 조회하여 SELECT 를 FOR문으로
다이나믹쿼리로 테이블명을 변경하면서 조회하고싶은데 가능한방법인지 질문드립니다.
답변부탁드려요!
한건만 리턴되는 내용은 아닌듯한데 테이블 함수를 쓰는건 어떨까요? 아래 간단한 예제가 있네요.
https://stackoverflow.com/questions/12578907/pl-sql-execute-immediate-in-pipelined-function
SQL> create table test1 (id int, v1 int); Table created. SQL> insert into test1 values (1,1); 1 row created. SQL> insert into test1 values (2,1); 1 row created. SQL> insert into test1 values (3,3); 1 row created. SQL> CREATE OR REPLACE PACKAGE pkg AS TYPE test_tab IS TABLE OF test1%ROWTYPE; FUNCTION dynamic_cursor(l_where VARCHAR2) RETURN test_tab PIPELINED; END; / Package created. SQL> CREATE OR REPLACE PACKAGE BODY pkg IS FUNCTION dynamic_cursor(l_where VARCHAR2) RETURN test_tab PIPELINED IS cc sys_refcursor; l_row test1%ROWTYPE; BEGIN OPEN cc FOR 'SELECT * FROM test1 WHERE ' || l_where; LOOP FETCH cc INTO l_row; EXIT WHEN cc%NOTFOUND; PIPE ROW (l_row); END LOOP; RETURN; END; END; / Package body created. SQL> SELECT * FROM TABLE(pkg.dynamic_cursor('id <= 2')); ID V1 ---------- ---------- 1 1 2 1