오라클 함수 커서변수와 SQL 쿼리문에 대해 질문드립니다. 0 1 2,739

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문으로

다이나믹쿼리로 테이블명을 변경하면서 조회하고싶은데 가능한방법인지 질문드립니다.

답변부탁드려요!

by pajama [2020.08.12 21:46:34]

한건만 리턴되는 내용은 아닌듯한데 테이블 함수를 쓰는건 어떨까요? 아래 간단한 예제가 있네요.

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

 


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