프로시져안에서 resultset을 부르려고 하는데 ... 0 3 2,326

by 손님 resultset cursor [2009.08.18 17:12:26]


안녕하세요

여기 저기 찾아보다 자료가 없어서 문의를 드립니다.

두대의 서버에 오라클이 설치되어있고

데이터를 주는 쪽에서는 패키지로 데이터를 주고 데이터를 받는쪽에서 현재 프로시저를 짜고 있습니다.

데이터를 주는 쪽의 패키지는

CREATE OR REPLACE PACKAGE DEV.PKG_INFO AS

    /*** 시행계획 리스트 ***/
    TYPE TYP_abc_LIST IS RECORD(
        a    VARCHAR2(12),    
        b    NUMBER,   
        c    VARCHAR2(200),   
        d    VARCHAR2(2),
        e    VARCHAR2(4),
        f    NUMBER   
    );

    TYPE REF_abc_LIST  IS REF CURSOR RETURN TYP_abc_LIST;


    PROCEDURE USP_GET_abc_LIST(in_a       IN VARCHAR2,     
                        in_b IN VARCHAR2,
                         in_c  IN NUMBER,
                         in_d    IN NUMBER,                  
                         RESULTSET     IN OUT REF_abc_LIST 
                        );
END PKG_INFO;

위의 형태로 되어있습니다.

저는 받는쪽을 만들어야 하는데

서로 다른 서버이기때문에 링크는 걸어줬는데

이 이후부터 프로시저에 서 문제가 생기네요

resultset를 사용하였기 때문에 cursor로 받아야 할듯한데

 

CREATE OR REPLACE PROCEDURE ForCursor_Test
        IS

        CURSOR dept_sum IS
        SELECT b.dname, COUNT(a.empno) cnt, SUM(a.sal) salary
        FROM emp a, dept b
        WHERE a.deptno = b.deptno
        GROUP BY b.dname;


     BEGIN

       -- Cursor를 FOR문에서 실행시킨다
       FOR emp_list IN dept_sum LOOP

          DBMS_OUTPUT.PUT_LINE(’부서명 : ’ || emp_list.dname);
          DBMS_OUTPUT.PUT_LINE(’사원수 : ’ || emp_list.cnt);
          DBMS_OUTPUT.PUT_LINE(’급여합계 : ’ || emp_list.salary);

       END LOOP;

   EXCEPTION

       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLERRM||’에러 발생 ’);

   END;

예제를 찾아보니 붉은색 부분만 수정하면 어느정도 맞출수 있을거같은데 도대체 모르겠더군요

고수님들의 도움을 부탁드립니다.

 

 

 

by 대궁이 [2009.08.18 17:35:14]
제가 나름 고쳐봤는데 초보라서;; 연습겸 해봤어요

맞나 모르겠어요 저도 공부중이라 ㅠ

by 대궁이 [2009.08.18 17:36:30]
CREATE OR REPLACE PROCEDURE ForCursor_Test
IS

CURSOR dept_sum IS
SELECT b.dname, COUNT(a.empno) cnt, SUM(a.sal) salary
FROM emp a, dept b
WHERE a.deptno = b.deptno
GROUP BY b.dname;


DNAME VARCHAR(100);
NUMBER CNT;
NUMBER SALARY;


BEGIN

-- Cursor를 FOR문에서 실행시킨다
OPEN dept_sum;
LOOP
FETCH dept_sum INTO DNAME,CNT,SALARY;
EXIT WHEN dept_sum%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(’부서명 : ’ || DNAME);
DBMS_OUTPUT.PUT_LINE(’사원수 : ’ || CNT);
DBMS_OUTPUT.PUT_LINE(’급여합계 : ’ || SALARY);

END LOOP;
CLOSE dept_sum;

EXCEPTION

WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM||’에러 발생 ’);

END;

by 손님 [2009.08.18 17:45:53]
음 제가 말씀드린건 저 프로시저에서 패키지의 프로시저를 콜하고 그걸 커서로 받는 방법을 여쩌본것인데요 ㅜㅜ
dev.PKG_INFO.USP_GET_abc_LIST(in_a, in_b, in_c, in_d, cursor)
이런식으로 커서를 사용해야할거같은데 안되네요ㅜㅜ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입