프로시저 실행시 ORA-01422 오류 발생과 관련 커서 사용법 0 3 1,559

by freDev [PL/SQL] plsql pl/sql 동적 쿼리 프로시져 커서 execute immediate cursor procedure [2020.03.05 15:14:40]


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를 어떤식으로 써야하나요

by freDev [2020.03.05 15:16:59]

결론적으로 현재는 varchar2로 선언된 v_result를 어떻게 cursor로 바꿀 것인가에 대한 질문입니다.


by 마농 [2020.03.05 16:34:09]
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;
/

 


by freDev [2020.03.05 18:57:43]

매우 잘 됩니다 감사합니다! 

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