首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回最后5轮并将其传递到选择的位置

返回最后5轮并将其传递到选择的位置
EN

Stack Overflow用户
提问于 2018-06-11 14:44:15
回答 1查看 38关注 0票数 0
代码语言:javascript
复制
    create or replace function get_last_5_rounds(i_party_id in number) return SYS_REFCURSOR as  
      resault_set SYS_REFCURSOR;
       v_round VAR_ROUND:=VAR_ROUND();

 begin  
SELECT round
    BULK COLLECT INTO v_round  
    FROM (SELECT DISTINCT session_id,
        ROUND
      FROM super_six_tickets
      where party_id = i_party_id
      ORDER BY session_id DESC
      )
    WHERE ROWNUM <= 5;
 OPEN RESAULT_SET for  
      select rp.session_id, s.symbol_name_in_number ball_number,
             rp.position ,
             rp.additional_symbol
      from   rp_deck rp,
             symbols s
      where  session_id MEMBER OF v_round 
      and    s.game_name_id in  38
      and    s.id = rp.card_name_id
      and    s.client_id = 1
      and    rp.position < 36
     order by rp.position ;  
  RETURN RESAULT_SET;
end get_last_5_rounds;

我有一个函数,将返回ball_number,位置从最后5轮(p_round)。

在“第一次选择”中,我得到了5轮,但在第二次选择中也出现了错误:

在此选择中需要一个INTO子句。

我将如何传递从第一次选择开始的所有回合,并用, (逗号)分隔它们以包括它们在子句中?

谢谢!

编辑:

现在我明白了:

我需要将所有位置和球号分开,以获得唯一的会话ID。现在,我将按位置进行排序。我怎么能这么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-12 05:19:34

在“第一次选择”中,我得到了5轮,但在第二次选择中也出现了错误:

即使您的第一个选择也会引发错误,因为您试图将多个行放入一个维度变量中。在您的情况下,您需要loop并填充变量,或者您需要创建一个collection并执行bulk操作以适应所有的行。

从第一次选择开始,我将如何传递所有的回合,并将它们与(逗号)分隔以包含在子句中?

您需要一个nested表来实现您的需求。请参阅下面的工作代码,并阅读内联解释以获得理解。

表:

代码语言:javascript
复制
CREATE TABLE super_six_tickets(session_id NUMBER,ROUND NUMBER);
/
CREATE TABLE  rp_deck (session_id NUMBER, position NUMBER,additional_symbol VARCHAR2(10));
/
CREATE TABLE symbols(symbol_name_in_number NUMBER);
/
 --Create a type of number to hold the result of you first query.
CREATE TYPE VAR_ROUND IS TABLE OF NUMBER;
/

功能:

代码语言:javascript
复制
CREATE OR REPLACE  FUNCTION get_last_5_rounds
    RETURN SYS_REFCURSOR
  AS
    resault_set SYS_REFCURSOR;

    --Initialization of varaible of nested table type 
    v_round VAR_ROUND:=VAR_ROUND();

BEGIN

    SELECT round
    BULK COLLECT INTO v_round  --<--Fetching the rounds information in the variable
    FROM
      (SELECT DISTINCT session_id,
        ROUND
      FROM super_six_tickets
      ORDER BY session_id DESC
      )
    WHERE ROWNUM <= 5;

--Opening Sys_refcursor to get the result.
    OPEN RESAULT_SET for   
    SELECT s.symbol_name_in_number ball_number,
           rp.position,
           rp.additional_symbol
    FROM rp_deck rp,
         symbols s
    WHERE rp.session_id MEMBER OF v_round --<-- checking In clause. 
    -- You can use this as well. However `MEMBER OF` clause is provided by Oracle to handle such situations.  
    --> rp.session_id in (Select column_value from table(v_round)) 
    ORDER BY rp.position ASC;

    RETURN RESAULT_SET;

  END get_last_5_rounds;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50800387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档