您可以按如下方式使用 row_number。但是我要明确一点,纯SQL方案会生成静态列数,如果要生成动态列数则需要使用PL/SQL方案。
使用PIVOT的SQL解决方案:
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;
/
此代码未经测试,因此如果您发现愚蠢的错误,则需要更正代码。