При первом выборе я получаю 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;