【发布时间】:2020-09-29 15:31:26
【问题描述】:
我正在尝试将 T-SQL 过程转换为 PL/PGSQL 过程, 当我运行我的函数时,出现以下错误:“在不能接受集合的上下文中调用的集合值函数”。 没有“返回查询”,我将有一个错误“查询没有结果数据的目的地”,这就是我添加它的原因 在下面找到错误消息和我的功能
create or replace function public.UP_GetCumulPerformancesParPortefeuille(strMatricule VARCHAR(20), strDevise varchar(3), dateDebut DATE) returns setof record
language plpgsql
as $$
BEGIN
DECLARE NO_PTF_V INT;
DT_CRS_V DATE;
PC_PRF_V FLOAT;
ResultF FLOAT = 0;
PreviousResult FLOAT = 0;
PreviousCPA INT = 0;
Performances public.performancestb;
PerfCumul public.perfcumultb;
curseur CURSOR FOR
SELECT NO_PTF, DT_CRS, SUM(PC_PRF * MT_DEM)
FROM (
SELECT D.NO_PTF, P.DT_CRS, P.PC_PRF
, D.MT_DEM/100 as MT_DEM
FROM public.TB_Demande D
INNER JOIN
public.performancestb P ON D.ID_CPA = P.ID_CPA
AND D.MC_UTL = strMatricule
) Q
WHERE DT_CRS >= dateDebut
GROUP BY NO_PTF, DT_CRS
ORDER BY NO_PTF, DT_CRS;
-- Chargement de l'historique des performances
--
BEGIN
INSERT INTO public.performancestb (ID_CPA, DT_CRS, PC_PRF)
SELECT ID_CPA, DT_CRS, PC_PRF FROM public.UF_GetHistoriquePerformances(strDevise);
OPEN curseur;
FETCH NEXT FROM curseur
INTO NO_PTF_V, DT_CRS_V, PC_PRF_V;
WHILE(found) loop
IF PreviousCPA = 0 OR PreviousCPA <> NO_PTF_V then
PreviousResult := 0;
PreviousCPA := NO_PTF_V;
end if;
ResultF := PreviousResult + PC_PRF_V * (PreviousResult + 100);
PreviousResult := ResultF;
INSERT INTO public.perfcumultb (NO_PTF, DT_CRS, MT_PRF)
VALUES (NO_PTF_V, DT_CRS_V, ResultF);
FETCH NEXT FROM curseur
INTO NO_PTF_V, DT_CRS_V, PC_PRF_V;
end loop;
CLOSE curseur;
Return query(SELECT NO_PTF, DT_CRS, MT_PRF, MT_PRF + 100 as MT_PRF_BSE_100
, CASE WHEN DT_CRS = FIRST_VALUE(DT_CRS) OVER (PARTITION BY NO_PTF ORDER BY NO_PTF,DT_CRS)
THEN 0
ELSE ((100 + MT_PRF) / (100 + LAG(MT_PRF, 1) OVER (PARTITION BY NO_PTF ORDER BY NO_PTF, DT_CRS))) - 1
END
* 100 AS MT_VOL
, CASE WHEN MT_PRF = FIRST_VALUE(MT_PRF) OVER (PARTITION BY NO_PTF ORDER BY NO_PTF, DT_CRS)
AND MT_PRF < 0
THEN MT_PRF
ELSE ((MT_PRF + 100) / MAX(MT_PRF + 100) OVER (PARTITION BY NO_PTF ORDER BY NO_PTF, DT_CRS
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 1 )
* 100
END AS MT_MAX_DDO
FROM public.perfcumultb);
end;
END;
$$;
【问题讨论】:
标签: postgresql stored-procedures plpgsql