在Oracle SQL中,如何将多个行值返回到一个游标变量中?
我在oracle中有一个包,其中包含一个存储过程。它将日期作为输入,数字作为输入,并将数据输出到ref_光标中。存储过程的目的是提取与特定输入日期对应的所有“中奖号码”在Oracle SQL中,如何将多个行值返回到一个游标变量中?,sql,database,oracle,cursor,Sql,Database,Oracle,Cursor,我在oracle中有一个包,其中包含一个存储过程。它将日期作为输入,数字作为输入,并将数据输出到ref_光标中。存储过程的目的是提取与特定输入日期对应的所有“中奖号码” CREATE OR REPLACE PACKAGE GETWINNINGNUMBERSBYDATEPKG IS TYPE lotgwndate_ref_cursor IS REF CURSOR; PROCEDURE GetWinningNumbersDATE (lg_wndate IN date, lg_wnwgid
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;
这是包体。同样,这里的目的是提取与特定日期和“gameid”编号对应的所有“中奖号码”。然后,我想将“中奖号码”与“游戏名称”和“抽奖日期”配对。(这是从抽奖图中提取记录)
这是通话程序
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
有没有办法做到这一点?我已经研究了许多其他问题,但没有一个问题与我的问题相同。ORACLE 11g如果使用
ORACLE 11g
,只需使用
调用者,必须修改如下
v_ballnumber VARCHAR2(4000);
我相信你提出的问题并没有解决我问题中的通话程序部分。它只处理select语句。我正在试图找出如何将agg字符串结果放入我的call procedure语句中。不幸的是,您所期望的
FETCH
实际上必须由您编写,以附加数字并使用临时变量。。。甲骨文与此无关,谢谢。我不知道实现这一点的语法。也许你可以告诉我一个资源?@MatheswaranRavisankar当我做出你建议的更改并运行调用过程时,我得到了ORA-01722无效号码
。有没有办法告诉调用过程希望字符串进入变量?问题是,对于您使用的%TYPE
变量(v_ballnumber),它引用了一个数字列。试着做一个VARCHAR2
。谢谢!我一直想弄明白这一点很长时间了!
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;
v_ballnumber VARCHAR2(4000);