возвращая последние 5 раундов и передавая их в выбранный - PullRequest
0 голосов
/ 11 июня 2018
    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;

enter image description here

У меня есть функция, которая будет возвращать ball_number, позицию из последних 5 раундов (p_round).

При первом выборе я получаю 5 раундов, но я также получаю ошибку при втором выборе:

В этом выборе ожидается предложение INTO

Как я пропущу все раунды из первого выбора и разделю их с помощью , (запятая), чтобы включить их в предложение IN?

Спасибо!

РЕДАКТИРОВАНИЕ:

Теперь яполучить это:

enter image description here

Мне нужно разделить все позиции и номер мяча для уникального идентификатора сессии.Теперь я сортируюсь по позиции.Как я могу это сделать?

1 Ответ

0 голосов
/ 12 июня 2018

При первом выборе я получаю 5 раундов, но я также получаю ошибку при втором выборе:

Даже ваш первый выбор выдаст ошибку, так как вы пытаетесь поместить несколько строк впеременная одного измерения.В вашем случае вам либо нужно loop и заполнить переменные, либо вам нужно создать операцию collection и выполнить bulk, чтобы она соответствовала всем строкам.

Как мне передать всераунды сначала выберите и разделите их, (запятая), чтобы включить их в предложение IN?

Вам понадобится таблица nested, чтобы выполнить ваше требование.Посмотрите ниже рабочий код и прочитайте встроенное объяснение для понимания.

Таблицы:

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;
/

Функция:

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;
...