CREATE OR REPLACE PROCEDURE get_data_freq(in_tab_name in varchar2, in_col_name in varchar2)
IS
v_query VARCHAR2(1000);
v_result VARCHAR2(1000);
BEGIN
v_query := 'SELECT * FROM (SELECT '|| in_col_name ||' || ''('' || COUNT('|| in_col_name ||') || '')'' AS data_frequency
FROM '|| in_tab_name ||'
GROUP BY '|| in_col_name ||'
ORDER BY COUNT('|| in_col_name ||') DESC)
WHERE ROWNUM <= 6';
EXECUTE IMMEDIATE v_query into v_result;
END;
테이블 명과 컬럼 명을 파라미터로 받아 데이터 빈도 수 상위 6위까지의 데이터와 그 빈도 수를 받아오는
프로시져를 작성하려고 합니다.
ORA-01422가 발생하는 것으로 보아 cursor를 써야하는 것 같은데 java 초급 개발자라
EXECUTE IMMEDIATE 와 cursor를 동시에 어떻게 써야하는지 잘 모르겠습니다.
cursor로 받아서 java에서 callablestatment로 받아오려고 하는데
cursor를 어떤식으로 써야하나요
결론적으로 현재는 varchar2로 선언된 v_result를 어떻게 cursor로 바꿀 것인가에 대한 질문입니다.
CREATE OR REPLACE PROCEDURE get_data_freq
( in_tab_name IN VARCHAR2
, in_col_name IN VARCHAR2
, v_result OUT SYS_REFCURSOR
)
IS
v_query VARCHAR2(1000);
BEGIN
v_query := 'SELECT * FROM (SELECT '
|| in_col_name ||' || ''('' || COUNT('|| in_col_name ||') || '')'' AS data_frequency '
|| ' FROM ' || in_tab_name
|| ' GROUP BY ' || in_col_name
|| ' ORDER BY COUNT('|| in_col_name ||') DESC) '
|| ' WHERE ROWNUM <= 6'
;
OPEN v_result FOR v_query;
END;
/
매우 잘 됩니다 감사합니다!