하고싶은 일은
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' 이렇게 나왔지만 정상작동은 안하더군요 ㅡㅡ;;
답변부탁드립니다.
감사합니다.
원하는 답인지는 모르겠지만 결과는 니오네요.
모바일 이다보니 글 쓰기가 힘드네요.
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')