1 | 하고싶은 일은 |
1 2 3 4 | SELECT 1 AS one , 2 AS two FROM DUAL WHERE 'A' in ( 'AA' , 'BB' , 'CC' , 'DD' , 'EE' ); |
이문장을
1 2 3 4 | SELECT 1 AS one , 2 AS two FROM DUAL WHERE 'A' in (table_func( 'AA, BB, CC, DD, EE' )); |
같이 하고 싶습니다.
또는
1 2 3 4 | SELECT 1 AS one , 2 AS two FROM DUAL WHERE 'A' in ( SELECT cd FROM table_func( 'AA, BB, CC, DD, EE' )); |
그래서 아래와 같이 Function을 만들려 하니 막혀서 여쭈어봅니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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하지 않고도
1 2 3 | SELECT LISTAGG( '' '' ||cd|| '' '' , ',' ) WITHIN GROUP ( ORDER BY cd) from ( |
이렇게 해보았으나 결과는 'A', 'B', 'C', 'D', E' 이렇게 나왔지만 정상작동은 안하더군요 ㅡㅡ;;
답변부탁드립니다.
감사합니다.
원하는 답인지는 모르겠지만 결과는 니오네요.
모바일 이다보니 글 쓰기가 힘드네요.
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')