2014-10-14 1 views
1

하나의 저장 프로 시저가 포함 된 oracle 패키지가 있습니다. 입력으로 날짜를 입력하고 숫자를 입력으로 사용하여 ref_cursor로 데이터를 출력합니다. 저장 프로 시저의 목적은 특정 입력 날짜에 해당하는 모든 "당첨 번호"를 추출하는 것입니다.Oracle SQL에서 하나의 커서 변수에 여러 행 값을 반환하려면 어떻게해야합니까?

CREATE OR REPLACE PACKAGE GETWINNINGNUMBERSBYDATEPKG IS 

TYPE lotgwndate_ref_cursor IS REF CURSOR;  
PROCEDURE GetWinningNumbersDATE (lg_wndate IN date, lg_wnwgid IN number, lg_ref OUT 
lotgwndate_ref_cursor); 

END GETWINNINGNUMBERSBYDATEPKG;  

이것은 패키지 본문입니다. 다시 말하지만, 여기서의 목적은 특정 날짜와 "게임 ID"번호에 해당하는 모든 "승리 숫자"를 추출하는 것입니다. 그런 다음, "우승 수"를 "게임 이름"과 "그리기 날짜"와 쌍으로 연결하고 싶습니다. (복권 그림에서 기록을 추출하는 것입니다)

PROCEDURE GetWinningNumbersDATE (lg_wndate IN date, lg_wnwgid IN number, lg_ref OUT  
    lotgwndate_ref_cursor) IS 
    BEGIN 
    OPEN lg_ref FOR 
     SELECT a.GAMENAME, b.DRAWINGDATE, c.BALLNUMBER 
     FROM GAMEDETAILS a 
      INNER JOIN WINNINGRECORDS b 
      on a.GAMEDETAILSID = b.GAMEDETAILSID 
       INNER JOIN WINNINGBALLS c 
       on b.WINNINGRECORDSID = c.WINNINGRECORDSID 


     WHERE b.DRAWINGDATE = lg_wndate 
     AND a.GAMEDETAILSID = lg_wnwgid; 

END GetWinningNumbersDATE; 

END GETWINNINGNUMBERSBYDATEPKG; 

다음은 통화 절차입니다.

SET SERVEROUTPUT ON size 100000 
DECLARE 
    v_cursor    LOTTERYGAMEPKG.lotgwndate_ref_cursor; 
    v_gamename    GAMEDETAILS.gamename%type; 
    v_drawingdate   WINNINGRECORDS.drawingdate%type; 
    v_ballnumber   WINNINGBALLS.ballnumber%type; 
BEGIN 
    GETWINNINGNUMBERSBYDATEPKG.GetWinningNumbersDATE(lg_wndate =>  
TO_DATE('06/08/2014','dd/mm/yyyy'), lg_wnwgid => '4', /*date/gamedetailsid #(1-4)*/ 
          lg_ref => v_cursor); 
LOOP        
    FETCH v_cursor 
    INTO v_gamename, v_drawingdate, v_ballnumber; 
    EXIT WHEN v_cursor%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE 
    (v_gamename || ',' || v_drawingdate || ',' || v_ballnumber); 
END LOOP; 
END; 

이 작동하고, 반환 : 그러나

NorthstarCash,06-AUG-14,10 
NorthstarCash,06-AUG-14,11 
NorthstarCash,06-AUG-14,15 
NorthstarCash,06-AUG-14,16 
NorthstarCash,06-AUG-14,21 

, 나는 그것이

NorthstarCash,06-AUG-14,10,11,15,16,21 

이 작업을 수행하기 위해 어떤 방법이 있습니까 돌아가려면? 나는 다른 많은 질문을 보았으나 아무도 나의 것과 같은 이슈를 다루지 않는다.

+0

내가 게시 한 질문이 내 질문의 통화 절차 부분을 해결하지 못한다고 생각합니다. select 문만을 처리합니다. agg 문자열 결과를 호출 프로 시저 문에 넣는 방법을 알아 내려고 노력 중입니다. –

+0

불행히도'FETCH'는 실제로 여러분이 숫자를 추가하고 임시 변수를 사용하여 작성해야만합니다 ... 오라클은 아무 관계가 없습니다. –

+0

감사합니다. 나는 이것을 성취 할 수있는 구문을 알지 못한다. 아마도 나를 자원으로 안내 할 수 있을까요? –

답변

0

당신이 Oracle 11g를 사용하는 경우 오라클 11g, 그냥 LISTAGG

PROCEDURE GetWinningNumbersDATE (lg_wndate IN date, lg_wnwgid IN number, lg_ref OUT  
    lotgwndate_ref_cursor) IS 
    BEGIN 
    OPEN lg_ref FOR 
     SELECT a.GAMENAME, b.DRAWINGDATE, LISTAGG(c.BALLNUMBER,',') WITHIN GROUP (ORDER BY c.BALLNUMBER) AS BALLNUMBER 
     FROM GAMEDETAILS a 
      INNER JOIN WINNINGRECORDS b 
      on a.GAMEDETAILSID = b.GAMEDETAILSID 
       INNER JOIN WINNINGBALLS c 
       on b.WINNINGRECORDSID = c.WINNINGRECORDSID 
     WHERE b.DRAWINGDATE = lg_wndate 
     AND a.GAMEDETAILSID = lg_wnwgid 
    GROUP BY a.GAMENAME, b.DRAWINGDATE; 

END GetWinningNumbersDATE; 

그리고 발신자를 사용하여 SELECT 쿼리를 수정, 아래와 같이 수정되어야한다.

v_ballnumber   VARCHAR2(4000); 
+0

@MatheswaranRavisankar 내가 당신이 제안하고 전화 절차를 실행 변경 사항을 만들면 나는'ORA-01722 invalid number'를 얻는다. 변수에 문자열이 오기를 기대하는 호출 프로 시저를 말하는 방법이 있습니까? –

+0

문제는 'FETCH INTO' 변수 (_v_ballnumber_)에 대해'NUMBER' 열을 참조하는'% TYPE'을 사용했습니다. 'VARCHAR2'로 해보십시오. –

+0

감사합니다! 나는 오랫동안 이것을 알아 내려고 노력했다. –

관련 문제