Funtion에서 SELECT MultiRow값을 Return 하고 싶습니다. 방법을 여쭈어봅니다. 0 5 4,666

by 짱구 [PL/SQL] function oracle select multirow return [2019.07.15 13:47:22]


하고싶은 일은
SELECT 1 AS one
     , 2 AS two
  FROM DUAL
 WHERE 'A' in ('AA', 'BB', 'CC', 'DD', 'EE');

 

이문장을

SELECT 1 AS one
     , 2 AS two
  FROM DUAL
 WHERE 'A' in (table_func('AA, BB, CC, DD, EE'));

같이 하고 싶습니다.

또는 

SELECT 1 AS one
     , 2 AS two
  FROM DUAL
 WHERE 'A' in (SELECT cd FROM table_func('AA, BB, CC, DD, EE'));

그래서 아래와 같이 Function을 만들려 하니 막혀서 여쭈어봅니다.

 

CREATE OR REPLACE TYPE obj_type AS object
( cd VARCHAR2(20));

CREATE OR REPLACE TYPE table_type 
AS TABLE OF obj_type;

CREATE OR REPLACE FUNCTION table_func (cd varchar2)
  RETURN table_type
  IS
    v_type TABLE_TYPE := table_type();
  BEGIN


   SELECT DECODE(cd, 'AA', 'A', 'BB', 'B', 'CC', 'C', 'DD', 'D', 'EE', 'E') AS cd
           FROM (SELECT TRIM(REGEXP_SUBSTR(cd, '[^,]+', 1, LEVEL)) cd
                   FROM DUAL
                CONNECT BY LEVEL <= REGEXP_COUNT(cd, ',') + 1) T;

-- 위처럼 문장은 만들었는데 어떻게 v_type 에 넣어서 RETURN해야 할지 몰라서 여쭈어 봅니다.

     
    RETURN v_type;
 END;

 

위처럼 select 해서 multirow로 return하지 않고도 

SELECT LISTAGG(''''||cd||'''', ',') WITHIN GROUP (ORDER BY cd)

from (

이렇게 해보았으나 결과는 'A', 'B', 'C', 'D', E' 이렇게 나왔지만 정상작동은 안하더군요 ㅡㅡ;;

 

답변부탁드립니다.

감사합니다.

by 우리집아찌 [2019.07.15 14:53:23]
http://www.gurubee.net/lecture/2238

 


by 짱구 [2019.07.15 16:57:57]

감사합니다.

사실 알려주신 URL 보고 어려워서 여쭈어본건데..

다른 사이트에서 찾아서 했습니다.


by 러드 [2019.07.16 14:33:58]

원하는 답인지는 모르겠지만 결과는 니오네요.

모바일 이다보니 글 쓰기가 힘드네요.

 

CREATE OR REPLACE FUNCTION table_func (cd varchar2)   

RETURN table_type PIPELINED -- /*명시하면 return 변수 지정안함*/   

AS v_type obj_type;

CURSOR col_cur IS

SELECT DECODE(cd, 'AA', 'A', 'BB', 'B', 'CC', 'C', 'DD', 'D', 'EE', 'E') AS cd            FROM (SELECT TRIM(REGEXP_SUBSTR(cd, '[^,]+', 1, LEVEL)) cd                    FROM DUAL                 CONNECT BY LEVEL <= REGEXP_COUNT(cd, ',') + 1) T;   

BEGIN  

v_type := obj_typr(NULL);  

 FOR col_rec IN col_cur LOOP      

        v_type.cd := col_rec.cd;      

         PIPE ROW(v_type);    

 END LOOP;      

 RETURN ;  

END;

 

 

Selsct * From TABLE(table_func('AA,BB')


by 러드 [2019.07.16 14:35:43]

v_type := obj_type(NULL);   오타네요....


by 러드 [2019.07.16 14:40:47]

그런데

"SELECT LISTAGG(''''||cd||'''', ',') WITHIN GROUP (ORDER BY cd)

from (..."

조회를 이렇게 하셨나요? LISTAGG는 문자열 합치는 함수인데요....

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