postgresql - 声明块中的 PostgreSQL 存储过程错误
问题描述
我正在尝试将 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 Performances TABLE(ID_CPA INT
, DT_CRS DATETIME
, PC_PRF FLOAT);*/
DECLARE Performances public.performancestb;
DECLARE NO_PTF INT
; DT_CRS DATE
; PC_PRF FLOAT
; ResultF FLOAT = 0
; PreviousResult FLOAT = 0
; PreviousCPA INT = 0;
/*DECLARE PerfCumul TABLE(NO_PTF INT
, DT_CRS DATE
, MT_PRF FLOAT);*/
DECLARE PerfCumul public.perfcumultb;
--SET NOCOUNT ON;
-- Chargement de l'historique des performances
--
BEGIN
INSERT INTO Performances (ID_CPA, DT_CRS, PC_PRF)
SELECT ID_CPA, DT_CRS, PC_PRF FROM public.UF_GetHistoriquePerformances(strDevise);
end;
--SELECT * FROM @Performances;
DECLARE 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
Performances 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;
begin
OPEN curseur;
FETCH NEXT FROM curseur
INTO NO_PTF, DT_CRS, PC_PRF;
解决方案
declare
是一个块而不是每一行的前缀。你只需要写一次,它必须在第一个之前begin
您的游标声明与实际代码块混合在一起。
所以是这样的:
DECLARE
Performances public.performancestb;
NO_PTF INT;
DT_CRS DATE;
PC_PRF FLOAT;
ResultF FLOAT = 0;
PreviousResult FLOAT = 0;
PreviousCPA INT = 0;
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
Performances 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;
BEGIN
INSERT INTO Performances (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, DT_CRS, PC_PRF;
close curseur;
END;
推荐阅读
- linux-kernel - 什么是 linux vhost 以及它如何帮助 virtio 卸载?
- reactjs - 在 useEffect Hook 中选择一个 DOM 元素
- c - 无法以编程方式启动 Linux TAP 设备
- c# - Jetbrains Rider 无法解决符号 ServiceCollection
- python - 无效的参数/选项 - '|'
- git - bitbucket 连接失败
- javascript - 如果我需要添加更多卡片,如何使我的卡片独立,同时使代码可扩展?
- php - 如何在laravel网站上传视频并保存和列表
- python - Python pad list 是下一个乘数 6 的大小
- html - jQuery:小标签字体大小,如果字段不为空