Вы можете использовать row_number следующим образом. но позвольте мне прояснить, что чистое решение SQL будет генерировать статическое число столбцов c. Если вы хотите сгенерировать динамическое число столбцов c, вам необходимо использовать решение PL / SQL.
SQL решение с использованием PIVOT
:
SELECT * FROM
(SELECT vu.fly
,tg.FININ fecha_ini
,td.BA33_DESC place
,tms.tms_util.getplazas_singuiachofer(:P10_FOLLETO, :P10_PRODUCTO, :P10_FECHA_INICIO) as passengers
,row_number() over (partition by tg.FININ, td.BA33_DESC order by vu.fly) as rn
FROM TABLE(fnc_obtener_vuelos_guia(:P10_FOLLETO, :P10_PRODUCTO, :P10_FECHA_INICIO)) vu
inner join tms.gui tg on (tg.fol = vu.fol and tg.prod = vu.producto and tg.FININ = vu.fecha_inicio)
inner join tms.dgp td on (tg.fol = td.fol and tg.prod = td.prod)
where td.fol = :P10_FOLLETO
and td.prod = :P10_PRODUCTO
and tg.FININ = :P10_FECHA_INICIO)
)
PIVOT (MAX(fly) for rn in (1,2,3,4));
- Обновление -
Вы можете использовать анонимный блок для заполнения курсор, а затем распечатать его следующим образом. В вашем приложении вы можете создать процедуру и вернуть курсор.
SET SERVEROUT ON
DECLARE
P_OUT_CUR SYS_REFCURSOR;
BEGIN
OPEN P_OUT_CUR FOR 'SELECT * FROM
(SELECT vu.fly
,tg.FININ fecha_ini
,td.BA33_DESC place
,tms.tms_util.getplazas_singuiachofer(:P10_FOLLETO, :P10_PRODUCTO, :P10_FECHA_INICIO) as passengers
,row_number() over (partition by tg.FININ, td.BA33_DESC order by vu.fly) as rn
FROM TABLE(fnc_obtener_vuelos_guia(:P10_FOLLETO, :P10_PRODUCTO, :P10_FECHA_INICIO)) vu
inner join tms.gui tg on (tg.fol = vu.fol and tg.prod = vu.producto and tg.FININ = vu.fecha_inicio)
inner join tms.dgp td on (tg.fol = td.fol and tg.prod = td.prod)
where td.fol = :P10_FOLLETO
and td.prod = :P10_PRODUCTO
and tg.FININ = :P10_FECHA_INICIO)
PIVOT (MAX(fly) for rn in ('
|| (
SELECT
LISTAGG(RN, ',') WITHIN GROUP(
ORDER BY
RN
)
FROM
(
SELECT
ROW_NUMBER() OVER(
PARTITION BY TG.FININ, TD.BA33_DESC
ORDER BY
VU.FLY
) AS RN
FROM
TABLE ( FNC_OBTENER_VUELOS_GUIA(:P10_FOLLETO, :P10_PRODUCTO, :P10_FECHA_INICIO) ) VU
INNER JOIN TMS.GUI TG ON ( TG.FOL = VU.FOL
AND TG.PROD = VU.PRODUCTO
AND TG.FININ = VU.FECHA_INICIO )
INNER JOIN TMS.DGP TD ON ( TG.FOL = TD.FOL
AND TG.PROD = TD.PROD )
WHERE
TD.FOL = :P10_FOLLETO
AND TD.PROD = :P10_PRODUCTO
AND TG.FININ = :P10_FECHA_INICIO
)
)
|| '))'
USING P10_FOLLETO, P10_PRODUCTO, P10_FECHA_INICIO, P10_FOLLETO, P10_PRODUCTO, P10_FECHA_INICIO, P10_FOLLETO, P10_PRODUCTO
, P10_FECHA_INICIO;
dbms_sql.return_result(P_OUT_CUR); -- JUST TO PRINT THE RESULT OF THE CURSOR
END;
/
Этот код не проверен, поэтому вам нужно исправить код, если вы обнаружите глупые ошибки.